Re: [FFmpeg-devel] [PATCH v2] avformat/mpegts: set data broadcast streams as such

2022-04-25 Thread Jan Ekström
On Mon, Apr 25, 2022 at 3:19 PM Jan Ekström  wrote:
>
> On Mon, Apr 25, 2022 at 2:33 PM Jan Ekström  wrote:
> >
> > On Mon, Apr 25, 2022 at 1:36 PM Jan Ekström  wrote:
> > >
> > > On Tue, Apr 19, 2022 at 11:06 PM Marton Balint  wrote:
> > > >
> > > >
> > > >
> > > > On Tue, 19 Apr 2022, Jan Ekström wrote:
> > > >
> > > > > On Tue, Apr 19, 2022 at 1:13 PM Jan Ekström  wrote:
> > > > >>
> > > > >> On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > On Thu, 14 Apr 2022, Jan Ekström wrote:
> > > > >> >
> > > > >> > > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  
> > > > >> > > wrote:
> > > > >> > >>
> > > > >> > >> From: Jan Ekström 
> > > > >> > >>
> > > > >> > >> Additionally, they should not be probed, as this is essentially
> > > > >> > >> various types of binary data.
> > > > >> > >>
> > > > >> > >> Signed-off-by: Jan Ekström 
> > > > >> > >> ---
> > > > >> > >
> > > > >> > > Ping.
> > > > >> > >
> > > > >> > > Basically this checks if we have an unknown stream with a private
> > > > >> > > stream type still at the end of the per-stream loop in PMT 
> > > > >> > > parsing,
> > > > >> > > and then cancels the stop of parsing that usually occurs as a 
> > > > >> > > PMT is
> > > > >> > > hit. Instead the logic will continue parsing further. When an 
> > > > >> > > SDT is
> > > > >> > > then found and a PMT for that program has already been received, 
> > > > >> > > it
> > > > >> > > will then stop header reading at that point.
> > > > >> >
> > > > >> > But why does it matter when the initial parsing is stopped? I mean 
> > > > >> > it
> > > > >> > stops at the first PMT right now, nobody expects it to find all the
> > > > >> > programs and all the streams or all the stream codecs/parameters.
> > > > >> >
> > > > >> > I am saying, that ideally, the ts->stop_parse magic should not be 
> > > > >> > needed
> > > > >> > to be changed to fix your issue and when an SDT is detected with 
> > > > >> > the
> > > > >> > broadcast descriptor that should stop any existing data stream 
> > > > >> > parsing. Do
> > > > >> > you know why it does not work like that?
> > > > >> >
> > > > >>
> > > > >> If the codec is unknown after header parsing, the general parsing
> > > > >> logic is utilized to probe which codec is possibly in that unknown
> > > > >> stream, and thus more data is read from that stream, which can cause
> > > > >> further delays.
> > > > >>
> > > > >> If the codec is known as data, it leads to no such result.
> > > > >>
> > > > >> Basically, the idea is to figure out whether a stream is a data 
> > > > >> stream
> > > > >> or not during header parsing, if possible.
> > > > >>
> > > > >
> > > > > Just double-checked and the difference is whether
> > > > > max_stream_analyze_duration gets utilized in
> > > > > libavformat/demux.c::avformat_find_stream_info .
> > > > >
> > > > > If a stream is marked as unknown, it will get checked for longer. If
> > > > > it is marked as a known "codec" it gets through quicker.
> > > >
> > > > The part of the patch which parses the SDT and sets the codec is fine.
> > > > But the fact that you have to set the codec during mpegts_read_header
> > > > to make it stop parsing definitely looks like some bug in some code
> > > > somewhere. It should be enough to set the codec sometime later in
> > > > mpegts_read_packet() (which is called during 
> > > > avformat_find_stream_info())
> > > >
> > > > Or to make it even more strange: comment out handle_packets() in
> > > > mpegts_read_header. And it will work just fine. So if nothing is parsed
> > > > in mpegts_read_header then it works. If something is parsed, then it 
> > > > does
> > > > not. Kind of unexpected...
> > > >
> > > > Regards,
> > > > Marton
> > >
> > > Hi,
> > >
> > > So I poked at this again and did the changes you requested. The result
> > > is that if the "continue parsing until SDT if you have these sorts of
> > > streams in-band" logic is removed, it leads to the FATE test ending up
> > > with the result of "codec_name=unknown". Which makes the test rather
> > > useless as it doesn't actually show that the stream is noted as a data
> > > stream. Additionally, I thought the logic made sense since as much as
> > > I dislike having information outside of PMT being utilized for PMT
> > > purposes, that is effectively what this SDT descriptor is utilized
> > > for. Given I specifically limited this logic to unknown streams within
> > > a specific stream identifier range, the effect of this change would
> > > have been far-from-global as well.
> > >
> > > I have a hunch that information is copied from the lavf-internal codec
> > > context to codecpar at one point, and then no further synchronization
> > > is attempted.
> >
> > So, when checking the following diff:
> >
> > diff --git a/libavformat/demux.c b/libavformat/demux.c
> > index ad7b5dbf83..6e483acb10 100644
> > --- a/libavformat/demux.c
> > +++ b/libavformat/demux.c
> > @@ -2909,6 +2909,11 @@ int 

Re: [FFmpeg-devel] [PATCH v2] avformat/mpegts: set data broadcast streams as such

2022-04-25 Thread Jan Ekström
On Mon, Apr 25, 2022 at 2:33 PM Jan Ekström  wrote:
>
> On Mon, Apr 25, 2022 at 1:36 PM Jan Ekström  wrote:
> >
> > On Tue, Apr 19, 2022 at 11:06 PM Marton Balint  wrote:
> > >
> > >
> > >
> > > On Tue, 19 Apr 2022, Jan Ekström wrote:
> > >
> > > > On Tue, Apr 19, 2022 at 1:13 PM Jan Ekström  wrote:
> > > >>
> > > >> On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
> > > >> >
> > > >> >
> > > >> >
> > > >> > On Thu, 14 Apr 2022, Jan Ekström wrote:
> > > >> >
> > > >> > > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  
> > > >> > > wrote:
> > > >> > >>
> > > >> > >> From: Jan Ekström 
> > > >> > >>
> > > >> > >> Additionally, they should not be probed, as this is essentially
> > > >> > >> various types of binary data.
> > > >> > >>
> > > >> > >> Signed-off-by: Jan Ekström 
> > > >> > >> ---
> > > >> > >
> > > >> > > Ping.
> > > >> > >
> > > >> > > Basically this checks if we have an unknown stream with a private
> > > >> > > stream type still at the end of the per-stream loop in PMT parsing,
> > > >> > > and then cancels the stop of parsing that usually occurs as a PMT 
> > > >> > > is
> > > >> > > hit. Instead the logic will continue parsing further. When an SDT 
> > > >> > > is
> > > >> > > then found and a PMT for that program has already been received, it
> > > >> > > will then stop header reading at that point.
> > > >> >
> > > >> > But why does it matter when the initial parsing is stopped? I mean it
> > > >> > stops at the first PMT right now, nobody expects it to find all the
> > > >> > programs and all the streams or all the stream codecs/parameters.
> > > >> >
> > > >> > I am saying, that ideally, the ts->stop_parse magic should not be 
> > > >> > needed
> > > >> > to be changed to fix your issue and when an SDT is detected with the
> > > >> > broadcast descriptor that should stop any existing data stream 
> > > >> > parsing. Do
> > > >> > you know why it does not work like that?
> > > >> >
> > > >>
> > > >> If the codec is unknown after header parsing, the general parsing
> > > >> logic is utilized to probe which codec is possibly in that unknown
> > > >> stream, and thus more data is read from that stream, which can cause
> > > >> further delays.
> > > >>
> > > >> If the codec is known as data, it leads to no such result.
> > > >>
> > > >> Basically, the idea is to figure out whether a stream is a data stream
> > > >> or not during header parsing, if possible.
> > > >>
> > > >
> > > > Just double-checked and the difference is whether
> > > > max_stream_analyze_duration gets utilized in
> > > > libavformat/demux.c::avformat_find_stream_info .
> > > >
> > > > If a stream is marked as unknown, it will get checked for longer. If
> > > > it is marked as a known "codec" it gets through quicker.
> > >
> > > The part of the patch which parses the SDT and sets the codec is fine.
> > > But the fact that you have to set the codec during mpegts_read_header
> > > to make it stop parsing definitely looks like some bug in some code
> > > somewhere. It should be enough to set the codec sometime later in
> > > mpegts_read_packet() (which is called during avformat_find_stream_info())
> > >
> > > Or to make it even more strange: comment out handle_packets() in
> > > mpegts_read_header. And it will work just fine. So if nothing is parsed
> > > in mpegts_read_header then it works. If something is parsed, then it does
> > > not. Kind of unexpected...
> > >
> > > Regards,
> > > Marton
> >
> > Hi,
> >
> > So I poked at this again and did the changes you requested. The result
> > is that if the "continue parsing until SDT if you have these sorts of
> > streams in-band" logic is removed, it leads to the FATE test ending up
> > with the result of "codec_name=unknown". Which makes the test rather
> > useless as it doesn't actually show that the stream is noted as a data
> > stream. Additionally, I thought the logic made sense since as much as
> > I dislike having information outside of PMT being utilized for PMT
> > purposes, that is effectively what this SDT descriptor is utilized
> > for. Given I specifically limited this logic to unknown streams within
> > a specific stream identifier range, the effect of this change would
> > have been far-from-global as well.
> >
> > I have a hunch that information is copied from the lavf-internal codec
> > context to codecpar at one point, and then no further synchronization
> > is attempted.
>
> So, when checking the following diff:
>
> diff --git a/libavformat/demux.c b/libavformat/demux.c
> index ad7b5dbf83..6e483acb10 100644
> --- a/libavformat/demux.c
> +++ b/libavformat/demux.c
> @@ -2909,6 +2909,11 @@ int avformat_find_stream_info(AVFormatContext
> *ic, AVDictionary **options)
>  FFStream *const sti = ffstream(st);
>  const char *errmsg;
>
> +av_log(ic, AV_LOG_VERBOSE,
> +   "stream %u (%sinitialized), codec context codec: %s,
> codecpar codec: %s\n",
> +   i, sti->avctx_inited ? "" : "not ",
> +   

Re: [FFmpeg-devel] [PATCH v2] avformat/mpegts: set data broadcast streams as such

2022-04-25 Thread Jan Ekström
On Mon, Apr 25, 2022 at 1:36 PM Jan Ekström  wrote:
>
> On Tue, Apr 19, 2022 at 11:06 PM Marton Balint  wrote:
> >
> >
> >
> > On Tue, 19 Apr 2022, Jan Ekström wrote:
> >
> > > On Tue, Apr 19, 2022 at 1:13 PM Jan Ekström  wrote:
> > >>
> > >> On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
> > >> >
> > >> >
> > >> >
> > >> > On Thu, 14 Apr 2022, Jan Ekström wrote:
> > >> >
> > >> > > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
> > >> > >>
> > >> > >> From: Jan Ekström 
> > >> > >>
> > >> > >> Additionally, they should not be probed, as this is essentially
> > >> > >> various types of binary data.
> > >> > >>
> > >> > >> Signed-off-by: Jan Ekström 
> > >> > >> ---
> > >> > >
> > >> > > Ping.
> > >> > >
> > >> > > Basically this checks if we have an unknown stream with a private
> > >> > > stream type still at the end of the per-stream loop in PMT parsing,
> > >> > > and then cancels the stop of parsing that usually occurs as a PMT is
> > >> > > hit. Instead the logic will continue parsing further. When an SDT is
> > >> > > then found and a PMT for that program has already been received, it
> > >> > > will then stop header reading at that point.
> > >> >
> > >> > But why does it matter when the initial parsing is stopped? I mean it
> > >> > stops at the first PMT right now, nobody expects it to find all the
> > >> > programs and all the streams or all the stream codecs/parameters.
> > >> >
> > >> > I am saying, that ideally, the ts->stop_parse magic should not be 
> > >> > needed
> > >> > to be changed to fix your issue and when an SDT is detected with the
> > >> > broadcast descriptor that should stop any existing data stream 
> > >> > parsing. Do
> > >> > you know why it does not work like that?
> > >> >
> > >>
> > >> If the codec is unknown after header parsing, the general parsing
> > >> logic is utilized to probe which codec is possibly in that unknown
> > >> stream, and thus more data is read from that stream, which can cause
> > >> further delays.
> > >>
> > >> If the codec is known as data, it leads to no such result.
> > >>
> > >> Basically, the idea is to figure out whether a stream is a data stream
> > >> or not during header parsing, if possible.
> > >>
> > >
> > > Just double-checked and the difference is whether
> > > max_stream_analyze_duration gets utilized in
> > > libavformat/demux.c::avformat_find_stream_info .
> > >
> > > If a stream is marked as unknown, it will get checked for longer. If
> > > it is marked as a known "codec" it gets through quicker.
> >
> > The part of the patch which parses the SDT and sets the codec is fine.
> > But the fact that you have to set the codec during mpegts_read_header
> > to make it stop parsing definitely looks like some bug in some code
> > somewhere. It should be enough to set the codec sometime later in
> > mpegts_read_packet() (which is called during avformat_find_stream_info())
> >
> > Or to make it even more strange: comment out handle_packets() in
> > mpegts_read_header. And it will work just fine. So if nothing is parsed
> > in mpegts_read_header then it works. If something is parsed, then it does
> > not. Kind of unexpected...
> >
> > Regards,
> > Marton
>
> Hi,
>
> So I poked at this again and did the changes you requested. The result
> is that if the "continue parsing until SDT if you have these sorts of
> streams in-band" logic is removed, it leads to the FATE test ending up
> with the result of "codec_name=unknown". Which makes the test rather
> useless as it doesn't actually show that the stream is noted as a data
> stream. Additionally, I thought the logic made sense since as much as
> I dislike having information outside of PMT being utilized for PMT
> purposes, that is effectively what this SDT descriptor is utilized
> for. Given I specifically limited this logic to unknown streams within
> a specific stream identifier range, the effect of this change would
> have been far-from-global as well.
>
> I have a hunch that information is copied from the lavf-internal codec
> context to codecpar at one point, and then no further synchronization
> is attempted.

So, when checking the following diff:

diff --git a/libavformat/demux.c b/libavformat/demux.c
index ad7b5dbf83..6e483acb10 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -2909,6 +2909,11 @@ int avformat_find_stream_info(AVFormatContext
*ic, AVDictionary **options)
 FFStream *const sti = ffstream(st);
 const char *errmsg;

+av_log(ic, AV_LOG_VERBOSE,
+   "stream %u (%sinitialized), codec context codec: %s,
codecpar codec: %s\n",
+   i, sti->avctx_inited ? "" : "not ",
+   avcodec_get_name(sti->avctx->codec_id),
avcodec_get_name(st->codecpar->codec_id));
+
 /* if no packet was ever seen, update context now for
has_codec_parameters */
 if (!sti->avctx_inited) {
 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&


..the result was that:
- codec context was already noted 

Re: [FFmpeg-devel] [PATCH v2] avformat/mpegts: set data broadcast streams as such

2022-04-25 Thread Jan Ekström
On Tue, Apr 19, 2022 at 11:06 PM Marton Balint  wrote:
>
>
>
> On Tue, 19 Apr 2022, Jan Ekström wrote:
>
> > On Tue, Apr 19, 2022 at 1:13 PM Jan Ekström  wrote:
> >>
> >> On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
> >> >
> >> >
> >> >
> >> > On Thu, 14 Apr 2022, Jan Ekström wrote:
> >> >
> >> > > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
> >> > >>
> >> > >> From: Jan Ekström 
> >> > >>
> >> > >> Additionally, they should not be probed, as this is essentially
> >> > >> various types of binary data.
> >> > >>
> >> > >> Signed-off-by: Jan Ekström 
> >> > >> ---
> >> > >
> >> > > Ping.
> >> > >
> >> > > Basically this checks if we have an unknown stream with a private
> >> > > stream type still at the end of the per-stream loop in PMT parsing,
> >> > > and then cancels the stop of parsing that usually occurs as a PMT is
> >> > > hit. Instead the logic will continue parsing further. When an SDT is
> >> > > then found and a PMT for that program has already been received, it
> >> > > will then stop header reading at that point.
> >> >
> >> > But why does it matter when the initial parsing is stopped? I mean it
> >> > stops at the first PMT right now, nobody expects it to find all the
> >> > programs and all the streams or all the stream codecs/parameters.
> >> >
> >> > I am saying, that ideally, the ts->stop_parse magic should not be needed
> >> > to be changed to fix your issue and when an SDT is detected with the
> >> > broadcast descriptor that should stop any existing data stream parsing. 
> >> > Do
> >> > you know why it does not work like that?
> >> >
> >>
> >> If the codec is unknown after header parsing, the general parsing
> >> logic is utilized to probe which codec is possibly in that unknown
> >> stream, and thus more data is read from that stream, which can cause
> >> further delays.
> >>
> >> If the codec is known as data, it leads to no such result.
> >>
> >> Basically, the idea is to figure out whether a stream is a data stream
> >> or not during header parsing, if possible.
> >>
> >
> > Just double-checked and the difference is whether
> > max_stream_analyze_duration gets utilized in
> > libavformat/demux.c::avformat_find_stream_info .
> >
> > If a stream is marked as unknown, it will get checked for longer. If
> > it is marked as a known "codec" it gets through quicker.
>
> The part of the patch which parses the SDT and sets the codec is fine.
> But the fact that you have to set the codec during mpegts_read_header
> to make it stop parsing definitely looks like some bug in some code
> somewhere. It should be enough to set the codec sometime later in
> mpegts_read_packet() (which is called during avformat_find_stream_info())
>
> Or to make it even more strange: comment out handle_packets() in
> mpegts_read_header. And it will work just fine. So if nothing is parsed
> in mpegts_read_header then it works. If something is parsed, then it does
> not. Kind of unexpected...
>
> Regards,
> Marton

Hi,

So I poked at this again and did the changes you requested. The result
is that if the "continue parsing until SDT if you have these sorts of
streams in-band" logic is removed, it leads to the FATE test ending up
with the result of "codec_name=unknown". Which makes the test rather
useless as it doesn't actually show that the stream is noted as a data
stream. Additionally, I thought the logic made sense since as much as
I dislike having information outside of PMT being utilized for PMT
purposes, that is effectively what this SDT descriptor is utilized
for. Given I specifically limited this logic to unknown streams within
a specific stream identifier range, the effect of this change would
have been far-from-global as well.

I have a hunch that information is copied from the lavf-internal codec
context to codecpar at one point, and then no further synchronization
is attempted.

As for the results being different without any packets being actually
demuxed, codec_info_nb_frames is possibly a variable which has some
relevance to it, although most checks against it seem to be of the > 1
type, instead of > 0.

Jan
___
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 v2] avformat/mpegts: set data broadcast streams as such

2022-04-19 Thread Marton Balint



On Tue, 19 Apr 2022, Jan Ekström wrote:


On Tue, Apr 19, 2022 at 1:13 PM Jan Ekström  wrote:


On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
>
>
>
> On Thu, 14 Apr 2022, Jan Ekström wrote:
>
> > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
> >>
> >> From: Jan Ekström 
> >>
> >> Additionally, they should not be probed, as this is essentially
> >> various types of binary data.
> >>
> >> Signed-off-by: Jan Ekström 
> >> ---
> >
> > Ping.
> >
> > Basically this checks if we have an unknown stream with a private
> > stream type still at the end of the per-stream loop in PMT parsing,
> > and then cancels the stop of parsing that usually occurs as a PMT is
> > hit. Instead the logic will continue parsing further. When an SDT is
> > then found and a PMT for that program has already been received, it
> > will then stop header reading at that point.
>
> But why does it matter when the initial parsing is stopped? I mean it
> stops at the first PMT right now, nobody expects it to find all the
> programs and all the streams or all the stream codecs/parameters.
>
> I am saying, that ideally, the ts->stop_parse magic should not be needed
> to be changed to fix your issue and when an SDT is detected with the
> broadcast descriptor that should stop any existing data stream parsing. Do
> you know why it does not work like that?
>

If the codec is unknown after header parsing, the general parsing
logic is utilized to probe which codec is possibly in that unknown
stream, and thus more data is read from that stream, which can cause
further delays.

If the codec is known as data, it leads to no such result.

Basically, the idea is to figure out whether a stream is a data stream
or not during header parsing, if possible.



Just double-checked and the difference is whether
max_stream_analyze_duration gets utilized in
libavformat/demux.c::avformat_find_stream_info .

If a stream is marked as unknown, it will get checked for longer. If
it is marked as a known "codec" it gets through quicker.


The part of the patch which parses the SDT and sets the codec is fine. 
But the fact that you have to set the codec during mpegts_read_header 
to make it stop parsing definitely looks like some bug in some code 
somewhere. It should be enough to set the codec sometime later in 
mpegts_read_packet() (which is called during avformat_find_stream_info())


Or to make it even more strange: comment out handle_packets() in 
mpegts_read_header. And it will work just fine. So if nothing is parsed 
in mpegts_read_header then it works. If something is parsed, then it does 
not. Kind of unexpected...


Regards,
Marton



There is a longer sample from an example stream under:
https://megumin.fushizen.eu/samples/2022-02-04-radio_with_data_stream/
with the files
13699753.{ts,aux}

You can then
`multicat -U ./13699753.ts "239.255.1.1:6001@127.0.0.1/ifaddr=127.0.0.1"`
and that should bind & connect and start pushing out UDP multicast via
localhost, using the aux file as timing.

Then you can with f.ex. ffprobe do
`/usr/bin/time -v ffprobe -v verbose -localaddr 127.0.0.1
udp://239.255.1.1:6001`
and compare the probe times with and without SDT being parsed during
the header read :) .

Jan
___
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".


Re: [FFmpeg-devel] [PATCH v2] avformat/mpegts: set data broadcast streams as such

2022-04-19 Thread Jan Ekström
On Tue, Apr 19, 2022 at 1:13 PM Jan Ekström  wrote:
>
> On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
> >
> >
> >
> > On Thu, 14 Apr 2022, Jan Ekström wrote:
> >
> > > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
> > >>
> > >> From: Jan Ekström 
> > >>
> > >> Additionally, they should not be probed, as this is essentially
> > >> various types of binary data.
> > >>
> > >> Signed-off-by: Jan Ekström 
> > >> ---
> > >
> > > Ping.
> > >
> > > Basically this checks if we have an unknown stream with a private
> > > stream type still at the end of the per-stream loop in PMT parsing,
> > > and then cancels the stop of parsing that usually occurs as a PMT is
> > > hit. Instead the logic will continue parsing further. When an SDT is
> > > then found and a PMT for that program has already been received, it
> > > will then stop header reading at that point.
> >
> > But why does it matter when the initial parsing is stopped? I mean it
> > stops at the first PMT right now, nobody expects it to find all the
> > programs and all the streams or all the stream codecs/parameters.
> >
> > I am saying, that ideally, the ts->stop_parse magic should not be needed
> > to be changed to fix your issue and when an SDT is detected with the
> > broadcast descriptor that should stop any existing data stream parsing. Do
> > you know why it does not work like that?
> >
>
> If the codec is unknown after header parsing, the general parsing
> logic is utilized to probe which codec is possibly in that unknown
> stream, and thus more data is read from that stream, which can cause
> further delays.
>
> If the codec is known as data, it leads to no such result.
>
> Basically, the idea is to figure out whether a stream is a data stream
> or not during header parsing, if possible.
>

Just double-checked and the difference is whether
max_stream_analyze_duration gets utilized in
libavformat/demux.c::avformat_find_stream_info .

If a stream is marked as unknown, it will get checked for longer. If
it is marked as a known "codec" it gets through quicker.

You can check an example locally with multicat:

There is a longer sample from an example stream under:
https://megumin.fushizen.eu/samples/2022-02-04-radio_with_data_stream/
with the files
13699753.{ts,aux}

You can then
`multicat -U ./13699753.ts "239.255.1.1:6001@127.0.0.1/ifaddr=127.0.0.1"`
and that should bind & connect and start pushing out UDP multicast via
localhost, using the aux file as timing.

Then you can with f.ex. ffprobe do
`/usr/bin/time -v ffprobe -v verbose -localaddr 127.0.0.1
udp://239.255.1.1:6001`
and compare the probe times with and without SDT being parsed during
the header read :) .

Jan
___
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 v2] avformat/mpegts: set data broadcast streams as such

2022-04-19 Thread Jan Ekström
On Tue, Apr 19, 2022 at 3:00 AM Marton Balint  wrote:
>
>
>
> On Thu, 14 Apr 2022, Jan Ekström wrote:
>
> > On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
> >>
> >> From: Jan Ekström 
> >>
> >> Additionally, they should not be probed, as this is essentially
> >> various types of binary data.
> >>
> >> Signed-off-by: Jan Ekström 
> >> ---
> >
> > Ping.
> >
> > Basically this checks if we have an unknown stream with a private
> > stream type still at the end of the per-stream loop in PMT parsing,
> > and then cancels the stop of parsing that usually occurs as a PMT is
> > hit. Instead the logic will continue parsing further. When an SDT is
> > then found and a PMT for that program has already been received, it
> > will then stop header reading at that point.
>
> But why does it matter when the initial parsing is stopped? I mean it
> stops at the first PMT right now, nobody expects it to find all the
> programs and all the streams or all the stream codecs/parameters.
>
> I am saying, that ideally, the ts->stop_parse magic should not be needed
> to be changed to fix your issue and when an SDT is detected with the
> broadcast descriptor that should stop any existing data stream parsing. Do
> you know why it does not work like that?
>

If the codec is unknown after header parsing, the general parsing
logic is utilized to probe which codec is possibly in that unknown
stream, and thus more data is read from that stream, which can cause
further delays.

If the codec is known as data, it leads to no such result.

Basically, the idea is to figure out whether a stream is a data stream
or not during header parsing, if possible.

Jan
___
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 v2] avformat/mpegts: set data broadcast streams as such

2022-04-18 Thread Marton Balint



On Thu, 14 Apr 2022, Jan Ekström wrote:


On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:


From: Jan Ekström 

Additionally, they should not be probed, as this is essentially
various types of binary data.

Signed-off-by: Jan Ekström 
---


Ping.

Basically this checks if we have an unknown stream with a private
stream type still at the end of the per-stream loop in PMT parsing,
and then cancels the stop of parsing that usually occurs as a PMT is
hit. Instead the logic will continue parsing further. When an SDT is
then found and a PMT for that program has already been received, it
will then stop header reading at that point.


But why does it matter when the initial parsing is stopped? I mean it 
stops at the first PMT right now, nobody expects it to find all the 
programs and all the streams or all the stream codecs/parameters.


I am saying, that ideally, the ts->stop_parse magic should not be needed 
to be changed to fix your issue and when an SDT is detected with the 
broadcast descriptor that should stop any existing data stream parsing. Do 
you know why it does not work like that?


Thanks,
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 v2] avformat/mpegts: set data broadcast streams as such

2022-04-14 Thread Jan Ekström
On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
>
> From: Jan Ekström 
>
> Additionally, they should not be probed, as this is essentially
> various types of binary data.
>
> Signed-off-by: Jan Ekström 
> ---

Ping.

Basically this checks if we have an unknown stream with a private
stream type still at the end of the per-stream loop in PMT parsing,
and then cancels the stop of parsing that usually occurs as a PMT is
hit. Instead the logic will continue parsing further. When an SDT is
then found and a PMT for that program has already been received, it
will then stop header reading at that point.

I do agree that DVB/ETSI deciding to put this descriptor in the SDT is
unfortunate, but actually setting the stream to a non-unknown codec
actually leads to reduced probing time, as unknown streams get probed
within the stream, and such data streams are often of very low data
rate (and generally contain no A/V/S data which could be probed).

Jan
___
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 v2] avformat/mpegts: set data broadcast streams as such

2022-04-11 Thread Jan Ekström
On Mon, Apr 11, 2022 at 1:50 PM Jan Ekström  wrote:
>
> From: Jan Ekström 
>
> Additionally, they should not be probed, as this is essentially
> various types of binary data.
>
> Signed-off-by: Jan Ekström 

Changes from v1:
- checking the length of descriptor to at least be 3 bytes before
reading them with getX(). The only error these functions can throw is
INVALIDDATA in case of the buffer not being large enough so this
should make sure that these reads cannot fail (VS checking each
separately for < 0).
- switching data type to the type returned by getX (int).

Jan
___
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 v2] avformat/mpegts: set data broadcast streams as such

2022-04-11 Thread Jan Ekström
From: Jan Ekström 

Additionally, they should not be probed, as this is essentially
various types of binary data.

Signed-off-by: Jan Ekström 
---
 libavformat/mpegts.c| 53 +
 tests/fate/mpegts.mak   |  3 ++
 tests/ref/fate/mpegts-probe-sdt-data-stream | 14 ++
 3 files changed, 70 insertions(+)
 create mode 100644 tests/ref/fate/mpegts-probe-sdt-data-stream

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 49f7735123..d41f7fc8bd 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -2516,6 +2516,13 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t 
*section, int section_len
 }
 }
 p = desc_list_end;
+
+if (!ts->pkt && (stream_type >= 0x80 && stream_type <= 0xFF) &&
+st->codecpar->codec_id == AV_CODEC_ID_NONE)
+// if we are reading headers, and still have a user private stream
+// with no proper codec set, do not stop reading at PMT. Data
+// streams are marked within SDT.
+ts->stop_parse = 0;
 }
 
 if (!ts->pids[pcr_pid])
@@ -2699,6 +2706,7 @@ static void sdt_cb(MpegTSFilter *filter, const uint8_t 
*section, int section_len
 if (val < 0)
 return;
 for (;;) {
+struct Program *program = NULL;
 sid = get16(, p_end);
 if (sid < 0)
 break;
@@ -2712,6 +2720,15 @@ static void sdt_cb(MpegTSFilter *filter, const uint8_t 
*section, int section_len
 desc_list_end  = p + desc_list_len;
 if (desc_list_end > p_end)
 break;
+
+program = get_program(ts, sid);
+
+if (!ts->pkt && program && program->pmt_found)
+// if during header reading we have already received a PMT for
+// this program and now have received an SDT for it, stop further
+// reading at this point.
+ts->stop_parse = 2;
+
 for (;;) {
 desc_tag = get8(, desc_list_end);
 if (desc_tag < 0)
@@ -2744,6 +2761,42 @@ static void sdt_cb(MpegTSFilter *filter, const uint8_t 
*section, int section_len
 av_free(name);
 av_free(provider_name);
 break;
+case 0x64: /* ETSI data broadcast descriptor; EN 300 468 6.2.11 */
+if (desc_len < 3)
+// length of the always available header part, up to and
+// including the component_tag field.
+break;
+
+{
+AVStream *st  = NULL;
+FFStream *sti = NULL;
+
+int data_broadcast_id = get16(, desc_end); // TS 101 162
+int component_tag = get8(, desc_end);
+if (!component_tag)
+// no stream mapping according to component_tag
+break;
+
+av_log(ts->stream, AV_LOG_TRACE,
+   "data broadcast id: %d, component tag: %d\n",
+   data_broadcast_id, component_tag);
+
+if (!program)
+break;
+
+st = find_matching_stream(ts, 0, sid, component_tag + 1, 0,
+  program);
+if (!st)
+break;
+
+sti = ffstream(st);
+
+st->codecpar->codec_type = AVMEDIA_TYPE_DATA;
+st->codecpar->codec_id   = AV_CODEC_ID_BIN_DATA;
+sti->request_probe = sti->need_parsing = 0;
+sti->need_context_update = 1;
+break;
+}
 default:
 break;
 }
diff --git a/tests/fate/mpegts.mak b/tests/fate/mpegts.mak
index bbcbfc47b2..ae21ee87d0 100644
--- a/tests/fate/mpegts.mak
+++ b/tests/fate/mpegts.mak
@@ -19,6 +19,9 @@ FATE_MPEGTS_PROBE-$(call DEMDEC, MPEGTS) += 
fate-mpegts-probe-pmt-merge
 fate-mpegts-probe-pmt-merge: SRC = $(TARGET_SAMPLES)/mpegts/pmtchange.ts
 fate-mpegts-probe-pmt-merge: CMD = run $(PROBE_CODEC_NAME_COMMAND) 
-merge_pmt_versions 1 -i "$(SRC)"
 
+FATE_MPEGTS_PROBE-$(call DEMDEC, MPEGTS, MP2) += 
fate-mpegts-probe-sdt-data-stream
+fate-mpegts-probe-sdt-data-stream: SRC = 
$(TARGET_SAMPLES)/mpegts/mpegts_sdt_data_stream.ts
+fate-mpegts-probe-sdt-data-stream: CMD = run $(PROBE_CODEC_NAME_COMMAND) -i 
"$(SRC)"
 
 FATE_SAMPLES_FFPROBE += $(FATE_MPEGTS_PROBE-yes)
 
diff --git a/tests/ref/fate/mpegts-probe-sdt-data-stream 
b/tests/ref/fate/mpegts-probe-sdt-data-stream
new file mode 100644
index 00..0b8e90962f
--- /dev/null
+++ b/tests/ref/fate/mpegts-probe-sdt-data-stream
@@ -0,0 +1,14 @@
+[PROGRAM]
+[STREAM]
+codec_name=mp2
+[/STREAM]
+[STREAM]
+codec_name=bin_data
+[/STREAM]
+[/PROGRAM]
+[STREAM]
+codec_name=mp2
+[/STREAM]
+[STREAM]
+codec_name=bin_data
+[/STREAM]
-- 
2.35.1