diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2013-01-16 19:52:58 +0100 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2013-01-19 00:32:01 +0100 |
commit | bbce913edfd8486e516a9335286c4d91b6728663 (patch) | |
tree | 476fdbc8d700802c090654b442faa50ee6e752ab /libavformat/segment.c | |
parent | 1de369a632c49449d71ecfe251599f840d3f8b63 (diff) | |
download | ffmpeg-bbce913edfd8486e516a9335286c4d91b6728663.tar.gz |
lavf/segment: move reference stream selection code to a dedicated function
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r-- | libavformat/segment.c | 105 |
1 files changed, 57 insertions, 48 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c index 3e85870732..d7f9cc30c8 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -451,11 +451,66 @@ static void close_null_ctx(AVIOContext *pb) av_free(pb); } +static int select_reference_stream(AVFormatContext *s) +{ + SegmentContext *seg = s->priv_data; + int ret, i; + + seg->reference_stream_index = -1; + if (!strcmp(seg->reference_stream_specifier, "auto")) { + /* select first index of type with highest priority */ + int type_index_map[AVMEDIA_TYPE_NB]; + static const enum AVMediaType type_priority_list[] = { + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_DATA, + AVMEDIA_TYPE_ATTACHMENT + }; + enum AVMediaType type; + + for (i = 0; i < AVMEDIA_TYPE_NB; i++) + type_index_map[i] = -1; + + /* select first index for each type */ + for (i = 0; i < s->nb_streams; i++) { + type = s->streams[i]->codec->codec_type; + if ((unsigned)type < AVMEDIA_TYPE_NB && type_index_map[type] == -1) + type_index_map[type] = i; + } + + for (i = 0; i < FF_ARRAY_ELEMS(type_priority_list); i++) { + type = type_priority_list[i]; + if ((seg->reference_stream_index = type_index_map[type]) >= 0) + break; + } + } else { + for (i = 0; i < s->nb_streams; i++) { + ret = avformat_match_stream_specifier(s, s->streams[i], + seg->reference_stream_specifier); + if (ret < 0) + break; + if (ret > 0) { + seg->reference_stream_index = i; + break; + } + } + } + + if (seg->reference_stream_index < 0) { + av_log(s, AV_LOG_ERROR, "Could not select stream matching identifier '%s'\n", + seg->reference_stream_specifier); + return AVERROR(EINVAL); + } + + return 0; +} + static int seg_write_header(AVFormatContext *s) { SegmentContext *seg = s->priv_data; AVFormatContext *oc = NULL; - int ret, i; + int ret; seg->segment_count = 0; if (!seg->write_header_trailer) @@ -515,54 +570,8 @@ static int seg_write_header(AVFormatContext *s) if (seg->list_type == LIST_TYPE_EXT) av_log(s, AV_LOG_WARNING, "'ext' list type option is deprecated in favor of 'csv'\n"); - seg->reference_stream_index = -1; - if (!strcmp(seg->reference_stream_specifier, "auto")) { - /* select first index of type with highest priority */ - int type_index_map[AVMEDIA_TYPE_NB]; - static const enum AVMediaType type_priority_list[] = { - AVMEDIA_TYPE_VIDEO, - AVMEDIA_TYPE_AUDIO, - AVMEDIA_TYPE_SUBTITLE, - AVMEDIA_TYPE_DATA, - AVMEDIA_TYPE_ATTACHMENT - }; - enum AVMediaType type; - - for (i = 0; i < AVMEDIA_TYPE_NB; i++) - type_index_map[i] = -1; - - /* select first index for each type */ - for (i = 0; i < s->nb_streams; i++) { - type = s->streams[i]->codec->codec_type; - if ((unsigned)type < AVMEDIA_TYPE_NB && type_index_map[type] == -1) - type_index_map[type] = i; - } - - for (i = 0; i < FF_ARRAY_ELEMS(type_priority_list); i++) { - type = type_priority_list[i]; - if ((seg->reference_stream_index = type_index_map[type]) >= 0) - break; - } - } else { - for (i = 0; i < s->nb_streams; i++) { - ret = avformat_match_stream_specifier(s, s->streams[i], - seg->reference_stream_specifier); - if (ret < 0) - goto fail; - if (ret > 0) { - seg->reference_stream_index = i; - break; - } - } - } - - if (seg->reference_stream_index < 0) { - av_log(s, AV_LOG_ERROR, "Could not select stream matching identifier '%s'\n", - seg->reference_stream_specifier); - ret = AVERROR(EINVAL); + if ((ret = select_reference_stream(s)) < 0) goto fail; - } - av_log(s, AV_LOG_VERBOSE, "Selected stream id:%d type:%s\n", seg->reference_stream_index, av_get_media_type_string(s->streams[seg->reference_stream_index]->codec->codec_type)); |