[FFmpeg-devel] [PATCH] avformat/mpegtsenc: Fix multi program so that it supports adding the same stream to multiple programs.

Vittorio Gambaletta (VittGam) ffmpeg-dev at vittgam.net
Sun Jan 24 15:54:34 CET 2016


Hi,

On 24/01/2016 12:01:38 CET, Michael Niedermayer wrote:
> On Sun, Jan 24, 2016 at 06:06:36AM +0100, Vittorio Gambaletta (VittGam) wrote:
>> Signed-off-by: Vittorio Gambaletta <ffmpeg-dev at vittgam.net>
>> ---
>>  libavformat/mpegtsenc.c |   15 +++++++++++++--
>>  1 file changed, 13 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
>> index 2c12043..a20e229 100644
>> --- a/libavformat/mpegtsenc.c
>> +++ b/libavformat/mpegtsenc.c
>> @@ -275,8 +275,19 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
>>          AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
>>
>>          if (s->nb_programs) {
>> -            AVProgram *program = av_find_program_from_stream(s, NULL, i);
>> -            if (program->id != service->sid)
>> +            int j, k, found = 0;
>> +
>> +            for (j = 0; j < s->nb_programs; j++)
>> +                if (s->programs[j]->id == service->sid) {
>> +                    for (k = 0; k < s->programs[j]->nb_stream_indexes; k++)
>> +                        if (s->programs[j]->stream_index[k] == i) {
>> +                            found = 1;
>> +                            break;
>> +                        }
>> +                    break;
>> +                }
>
> av_find_program_from_stream() should be run in a loop to enumerate
> the programs, see other uses of av_find_program_from_stream()

Wouldn't this solve the problem backwards?

We need to search the program that has the same ID as the service
being evaluated, and then we search that program for the stream with
the same ID as the stream being evaluated. My code does that.

av_find_program_from_stream() instead enumerates every stream in every
program (starting from `last`) until it finds a stream with the same ID
as the stream being searched, so every time it returns a different
program ID. In fact it is used to update every program that contain
a certain stream, not the reverse.

Cheers,
Vittorio


More information about the ffmpeg-devel mailing list