diff options
| author | Stefano Sabatini <[email protected]> | 2013-01-16 19:52:58 +0100 | 
|---|---|---|
| committer | Stefano Sabatini <[email protected]> | 2013-01-19 00:32:01 +0100 | 
| commit | bbce913edfd8486e516a9335286c4d91b6728663 (patch) | |
| tree | 476fdbc8d700802c090654b442faa50ee6e752ab /libavformat/segment.c | |
| parent | 1de369a632c49449d71ecfe251599f840d3f8b63 (diff) | |
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)); | 
