[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
Mon Jan 25 20:46:19 CET 2016


Hi,

On 25/01/2016 19:35:58 CET, Michael Niedermayer wrote:
> On Sun, Jan 24, 2016 at 03:54:34PM +0100, Vittorio Gambaletta (VittGam) wrote:
>> 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?
>
> yes, though it would avoid directly accessing the data structs.
> no big problem really though, i see the av_find_program_from_stream()
> isnt exactly optimal here
> so applied
>
> thanks

You're welcome!

Well, if the same logic needs to be reused somewhere else, it could
always be put in a new function, maybe av_check_stream_is_in_program().

Cheers,
Vittorio


More information about the ffmpeg-devel mailing list