+static int handle_io_open_error(AVFormatContext *s, int err, char *url) {
+ DASHContext *c = s->priv_data;
+ char errbuf[AV_ERROR_MAX_STRING_SIZE];
+ av_strerror(err, errbuf, sizeof(errbuf));
+ av_log(s, c->ignore_io_errors ? AV_LOG_WARNING : AV_LOG_ERROR,
+ "Unable to open %s for writing: %s\n", url, errbuf);
+ return c->ignore_io_errors ? 0 : err;
+}
+
+static inline SegmentType select_segment_type(SegmentType segment_type, enum AVCodecID codec_id)
+{
+ if (segment_type == SEGMENT_TYPE_AUTO) {
+ if (codec_id == AV_CODEC_ID_OPUS || codec_id == AV_CODEC_ID_VORBIS ||
+ codec_id == AV_CODEC_ID_VP8 || codec_id == AV_CODEC_ID_VP9) {
+ segment_type = SEGMENT_TYPE_WEBM;
+ } else {
+ segment_type = SEGMENT_TYPE_MP4;
+ }
+ }
+
+ return segment_type;
+}
+
+static int init_segment_types(AVFormatContext *s)
+{
+ DASHContext *c = s->priv_data;
+ int has_mp4_streams = 0;
+ for (int i = 0; i < s->nb_streams; ++i) {
+ OutputStream *os = &c->streams[i];
+ SegmentType segment_type = select_segment_type(
+ c->segment_type_option, s->streams[i]->codecpar->codec_id);
+ os->segment_type = segment_type;
+ os->format_name = get_format_str(segment_type);
+ if (!os->format_name) {
+ av_log(s, AV_LOG_ERROR, "Could not select DASH segment type for stream %d\n", i);
+ return AVERROR_MUXER_NOT_FOUND;
+ }
+ has_mp4_streams |= segment_type == SEGMENT_TYPE_MP4;
+ }
+
+ if (c->hls_playlist && !has_mp4_streams) {
+ av_log(s, AV_LOG_WARNING, "No mp4 streams, disabling HLS manifest generation\n");
+ c->hls_playlist = 0;
+ }
+
+ return 0;
+}
+