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

2019-07-12 Thread Marton Balint



On Tue, 9 Jul 2019, Aman Gupta wrote:


On Tue, Jul 9, 2019 at 2:07 PM Marton Balint  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!


Thanks, applied.

Regards,
Marton
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

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

2019-07-09 Thread Aman Gupta
On Tue, Jul 9, 2019 at 2:07 PM Marton Balint  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 
> ---
>  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@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

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

2019-07-09 Thread Marton Balint
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.

Signed-off-by: Marton Balint 
---
 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@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".