Also extend the functionality to use the last found program to start the search after that program. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
@@ -13,6 +13,9 @@ libavutil: 2011-04-18 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2011-08-22 - xxxxxx - lavf 53.10.0 | |||||
Add av_find_program_from_stream(). | |||||
2011-08-20 - xxxxxx - lavu 51.13.0 | 2011-08-20 - xxxxxx - lavu 51.13.0 | ||||
Add av_get_media_type_string(). | Add av_get_media_type_string(). | ||||
@@ -1232,6 +1232,18 @@ int av_find_stream_info(AVFormatContext *ic); | |||||
*/ | */ | ||||
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); | int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); | ||||
/** | |||||
* Find the programs which belong to a given stream. | |||||
* | |||||
* @param ic media file handle | |||||
* @param last the last found program, the search will start after this | |||||
* program, or from the beginning if it is NULL | |||||
* @param s stream index | |||||
* @return the next program which belongs to s, NULL if no program is found or | |||||
* the last program is not among the programs of ic. | |||||
*/ | |||||
AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); | |||||
/** | /** | ||||
* Find the "best" stream in the file. | * Find the "best" stream in the file. | ||||
* The best stream is determined according to various heuristics as the most | * The best stream is determined according to various heuristics as the most | ||||
@@ -2574,14 +2574,20 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) | |||||
return ret; | return ret; | ||||
} | } | ||||
static AVProgram *find_program_from_stream(AVFormatContext *ic, int s) | |||||
AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s) | |||||
{ | { | ||||
int i, j; | int i, j; | ||||
for (i = 0; i < ic->nb_programs; i++) | |||||
for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++) | |||||
if (ic->programs[i]->stream_index[j] == s) | |||||
return ic->programs[i]; | |||||
for (i = 0; i < ic->nb_programs; i++) { | |||||
if (ic->programs[i] == last) { | |||||
last = NULL; | |||||
} else { | |||||
if (!last) | |||||
for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++) | |||||
if (ic->programs[i]->stream_index[j] == s) | |||||
return ic->programs[i]; | |||||
} | |||||
} | |||||
return NULL; | return NULL; | ||||
} | } | ||||
@@ -2598,7 +2604,7 @@ int av_find_best_stream(AVFormatContext *ic, | |||||
AVCodec *decoder = NULL, *best_decoder = NULL; | AVCodec *decoder = NULL, *best_decoder = NULL; | ||||
if (related_stream >= 0 && wanted_stream_nb < 0) { | if (related_stream >= 0 && wanted_stream_nb < 0) { | ||||
AVProgram *p = find_program_from_stream(ic, related_stream); | |||||
AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream); | |||||
if (p) { | if (p) { | ||||
program = p->stream_index; | program = p->stream_index; | ||||
nb_streams = p->nb_stream_indexes; | nb_streams = p->nb_stream_indexes; | ||||
@@ -24,7 +24,7 @@ | |||||
#include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
#define LIBAVFORMAT_VERSION_MAJOR 53 | #define LIBAVFORMAT_VERSION_MAJOR 53 | ||||
#define LIBAVFORMAT_VERSION_MINOR 9 | |||||
#define LIBAVFORMAT_VERSION_MINOR 10 | |||||
#define LIBAVFORMAT_VERSION_MICRO 0 | #define LIBAVFORMAT_VERSION_MICRO 0 | ||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||