[FFmpeg-devel] [PATCH] avformat/mpegts: respect program number when merging streams

Aman Gupta ffmpeg at tmm1.net
Wed Jul 10 02:39:43 EEST 2019


On Tue, Jul 9, 2019 at 2:07 PM Marton Balint <cus at passwd.hu> wrote:

> merge_pmt_versions was not usable if multiple programs were present because
> when it was searching for candidate streams it did not make sure that the
> PMT was
> of the same program. This caused the streams of all programs to get merged
> into
> a single (garbled) program.
>
> This patch makes sure that the program number (service ID) is also matching
> with the old streams when parsing the PMT making the feature useful for
> multi
> program streams.
>
> This change might cause issues for single program streams if the program
> number
> changes as well, but I think it is acceptable because the goal of the
> option is
> to make the parsing resilient to PID changes, and that is still working as
> expected.
>

Patch looks good to me. Thanks for catching this!

Aman


>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
>  libavformat/mpegts.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index 8a84e5cc19..47d8d5f877 100644
> --- a/libavformat/mpegts.c
> +++ b/libavformat/mpegts.c
> @@ -2130,7 +2130,7 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc,
> AVStream *st, int stream_type
>      return 0;
>  }
>
> -static AVStream *find_matching_stream(MpegTSContext *ts, int pid,
> +static AVStream *find_matching_stream(MpegTSContext *ts, int pid,
> unsigned int programid,
>                                        int stream_identifier, int
> pmt_stream_idx)
>  {
>      AVFormatContext *s = ts->stream;
> @@ -2139,6 +2139,8 @@ static AVStream *find_matching_stream(MpegTSContext
> *ts, int pid,
>
>      for (i = 0; i < s->nb_streams; i++) {
>          AVStream *st = s->streams[i];
> +        if (st->program_num != programid)
> +            continue;
>          if (stream_identifier != -1) { /* match based on "stream
> identifier descriptor" if present */
>              if (st->stream_identifier == stream_identifier+1) {
>                  found = st;
> @@ -2309,7 +2311,7 @@ static void pmt_cb(MpegTSFilter *filter, const
> uint8_t *section, int section_len
>          if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
>              pes = ts->pids[pid]->u.pes_filter.opaque;
>              if (ts->merge_pmt_versions && !pes->st) {
> -                st = find_matching_stream(ts, pid, stream_identifier, i);
> +                st = find_matching_stream(ts, pid, h->id,
> stream_identifier, i);
>                  if (st) {
>                      pes->st = st;
>                      pes->stream_type = stream_type;
> @@ -2331,7 +2333,7 @@ static void pmt_cb(MpegTSFilter *filter, const
> uint8_t *section, int section_len
>                  mpegts_close_filter(ts, ts->pids[pid]); // wrongly added
> sdt filter probably
>              pes = add_pes_stream(ts, pid, pcr_pid);
>              if (ts->merge_pmt_versions && pes && !pes->st) {
> -                st = find_matching_stream(ts, pid, stream_identifier, i);
> +                st = find_matching_stream(ts, pid, h->id,
> stream_identifier, i);
>                  if (st) {
>                      pes->st = st;
>                      pes->stream_type = stream_type;
> @@ -2353,7 +2355,7 @@ static void pmt_cb(MpegTSFilter *filter, const
> uint8_t *section, int section_len
>                  st = ts->stream->streams[idx];
>              }
>              if (ts->merge_pmt_versions && !st) {
> -                st = find_matching_stream(ts, pid, stream_identifier, i);
> +                st = find_matching_stream(ts, pid, h->id,
> stream_identifier, i);
>              }
>              if (!st) {
>                  st = avformat_new_stream(ts->stream, NULL);
> --
> 2.16.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list