* [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
@ 2022-07-05 7:50 Zhao Zhili
2022-07-05 12:07 ` Gyan Doshi
0 siblings, 1 reply; 11+ messages in thread
From: Zhao Zhili @ 2022-07-05 7:50 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Zhao Zhili
From: Zhao Zhili <zhilizhao@tencent.com>
Streams with all zero sample_delta in 'stts' have all zero dts.
They have higher chance be chose by mov_find_next_sample(), which
leads to seek again and again.
For example, GoPro created a 'GoPro SOS' stream:
Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
Metadata:
creation_time : 2022-06-21T08:49:19.000000Z
handler_name : GoPro SOS
With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
blocks until all samples in 'GoPro SOS' stream are consumed first.
Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
libavformat/mov.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 88669faa70..2a4eb79f27 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st->nb_frames= total_sample_count;
if (duration)
st->duration= FFMIN(st->duration, duration);
+
+ // All samples have zero duration. They have higher chance be chose by
+ // mov_find_next_sample, which leads to seek again and again.
+ //
+ // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
+ // So only mark data stream as discarded for safety.
+ if (!duration && sc->stts_count &&
+ st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
+ av_log(c->fc, AV_LOG_WARNING,
+ "All samples in data stream index:id [%d:%d] have zero duration, "
+ "discard the stream\n",
+ st->index, st->id);
+ st->discard = AVDISCARD_ALL;
+ }
sc->track_end = duration;
return 0;
}
--
2.35.3
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-05 7:50 [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta Zhao Zhili
@ 2022-07-05 12:07 ` Gyan Doshi
2022-07-05 13:35 ` "zhilizhao(赵志立)"
0 siblings, 1 reply; 11+ messages in thread
From: Gyan Doshi @ 2022-07-05 12:07 UTC (permalink / raw)
To: ffmpeg-devel
On 2022-07-05 01:20 pm, Zhao Zhili wrote:
> From: Zhao Zhili <zhilizhao@tencent.com>
>
> Streams with all zero sample_delta in 'stts' have all zero dts.
> They have higher chance be chose by mov_find_next_sample(), which
> leads to seek again and again.
>
> For example, GoPro created a 'GoPro SOS' stream:
> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
> Metadata:
> creation_time : 2022-06-21T08:49:19.000000Z
> handler_name : GoPro SOS
>
> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
> blocks until all samples in 'GoPro SOS' stream are consumed first.
>
> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
> ---
> libavformat/mov.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 88669faa70..2a4eb79f27 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> st->nb_frames= total_sample_count;
> if (duration)
> st->duration= FFMIN(st->duration, duration);
> +
> + // All samples have zero duration. They have higher chance be chose by
> + // mov_find_next_sample, which leads to seek again and again.
> + //
> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
> + // So only mark data stream as discarded for safety.
> + if (!duration && sc->stts_count &&
> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
> + av_log(c->fc, AV_LOG_WARNING,
> + "All samples in data stream index:id [%d:%d] have zero duration, "
> + "discard the stream\n",
> + st->index, st->id);
> + st->discard = AVDISCARD_ALL;
> + }
> sc->track_end = duration;
> return 0;
> }
So this will allow audio and video streams to be demuxed, but not data?
That distinction seems arbitrary.
Print a warning and assign a duration to each sample. Either 1 or if not
zero/Inf, st->duration/st->nb_frames.
Regards,
Gyan
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-05 12:07 ` Gyan Doshi
@ 2022-07-05 13:35 ` "zhilizhao(赵志立)"
2022-07-05 14:33 ` Gyan Doshi
0 siblings, 1 reply; 11+ messages in thread
From: "zhilizhao(赵志立)" @ 2022-07-05 13:35 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> On Jul 5, 2022, at 8:07 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>
>
>
> On 2022-07-05 01:20 pm, Zhao Zhili wrote:
>> From: Zhao Zhili <zhilizhao@tencent.com>
>>
>> Streams with all zero sample_delta in 'stts' have all zero dts.
>> They have higher chance be chose by mov_find_next_sample(), which
>> leads to seek again and again.
>>
>> For example, GoPro created a 'GoPro SOS' stream:
>> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
>> Metadata:
>> creation_time : 2022-06-21T08:49:19.000000Z
>> handler_name : GoPro SOS
>>
>> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
>> blocks until all samples in 'GoPro SOS' stream are consumed first.
>>
>> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
>> ---
>> libavformat/mov.c | 14 ++++++++++++++
>> 1 file changed, 14 insertions(+)
>>
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index 88669faa70..2a4eb79f27 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>> st->nb_frames= total_sample_count;
>> if (duration)
>> st->duration= FFMIN(st->duration, duration);
>> +
>> + // All samples have zero duration. They have higher chance be chose by
>> + // mov_find_next_sample, which leads to seek again and again.
>> + //
>> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
>> + // So only mark data stream as discarded for safety.
>> + if (!duration && sc->stts_count &&
>> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
>> + av_log(c->fc, AV_LOG_WARNING,
>> + "All samples in data stream index:id [%d:%d] have zero duration, "
>> + "discard the stream\n",
>> + st->index, st->id);
>> + st->discard = AVDISCARD_ALL;
>> + }
>> sc->track_end = duration;
>> return 0;
>> }
>
> So this will allow audio and video streams to be demuxed, but not data? That distinction seems arbitrary.
Disable audio/video streams may create regression. It’s unlikely for random
and broken data stream.
>
> Print a warning and assign a duration to each sample. Either 1 or if not zero/Inf, st->duration/st->nb_frames.
Set sample_duration to 1 doesn’t work. Dts still far behind other streams.
Set sample_duration st->duration/st->nb_frames works for me, but I prefer
current strategy for the following reasons:
1. AVDISCARD_ALL is more close to AVERROR_INVALIDDATA by giving up instead
of trying correction and hope it works, which may not, e.g., st->duration
is broken, or bad interleave even though we fixed sample_duration.
2. libavformat users can enable the stream and get the original dts/duration,
if they want to.
>
> Regards,
> Gyan
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@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-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-05 13:35 ` "zhilizhao(赵志立)"
@ 2022-07-05 14:33 ` Gyan Doshi
2022-07-06 2:53 ` "zhilizhao(赵志立)"
0 siblings, 1 reply; 11+ messages in thread
From: Gyan Doshi @ 2022-07-05 14:33 UTC (permalink / raw)
To: ffmpeg-devel
On 2022-07-05 07:05 pm, "zhilizhao(赵志立)" wrote:
>
>> On Jul 5, 2022, at 8:07 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>
>>
>>
>> On 2022-07-05 01:20 pm, Zhao Zhili wrote:
>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>
>>> Streams with all zero sample_delta in 'stts' have all zero dts.
>>> They have higher chance be chose by mov_find_next_sample(), which
>>> leads to seek again and again.
>>>
>>> For example, GoPro created a 'GoPro SOS' stream:
>>> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
>>> Metadata:
>>> creation_time : 2022-06-21T08:49:19.000000Z
>>> handler_name : GoPro SOS
>>>
>>> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
>>> blocks until all samples in 'GoPro SOS' stream are consumed first.
>>>
>>> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
>>> ---
>>> libavformat/mov.c | 14 ++++++++++++++
>>> 1 file changed, 14 insertions(+)
>>>
>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>> index 88669faa70..2a4eb79f27 100644
>>> --- a/libavformat/mov.c
>>> +++ b/libavformat/mov.c
>>> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>> st->nb_frames= total_sample_count;
>>> if (duration)
>>> st->duration= FFMIN(st->duration, duration);
>>> +
>>> + // All samples have zero duration. They have higher chance be chose by
>>> + // mov_find_next_sample, which leads to seek again and again.
>>> + //
>>> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
>>> + // So only mark data stream as discarded for safety.
>>> + if (!duration && sc->stts_count &&
>>> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
>>> + av_log(c->fc, AV_LOG_WARNING,
>>> + "All samples in data stream index:id [%d:%d] have zero duration, "
>>> + "discard the stream\n",
>>> + st->index, st->id);
>>> + st->discard = AVDISCARD_ALL;
>>> + }
>>> sc->track_end = duration;
>>> return 0;
>>> }
>> So this will allow audio and video streams to be demuxed, but not data? That distinction seems arbitrary.
> Disable audio/video streams may create regression. It’s unlikely for random
> and broken data stream.
>
>> Print a warning and assign a duration to each sample. Either 1 or if not zero/Inf, st->duration/st->nb_frames.
> Set sample_duration to 1 doesn’t work. Dts still far behind other streams.
>
> Set sample_duration st->duration/st->nb_frames works for me, but I prefer
> current strategy for the following reasons:
>
> 1. AVDISCARD_ALL is more close to AVERROR_INVALIDDATA by giving up instead
> of trying correction and hope it works, which may not, e.g., st->duration
> is broken, or bad interleave even though we fixed sample_duration.
It's not about hoping that it works. It's about not preventing the user
from acquiring the stream payload.
Can you test if setting -discard:d none -i INPUT allows reading the
stream with your patch?
Regards,
Gyan
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-05 14:33 ` Gyan Doshi
@ 2022-07-06 2:53 ` "zhilizhao(赵志立)"
2022-07-06 4:09 ` Gyan Doshi
0 siblings, 1 reply; 11+ messages in thread
From: "zhilizhao(赵志立)" @ 2022-07-06 2:53 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> On Jul 5, 2022, at 10:33 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>
>
>
> On 2022-07-05 07:05 pm, "zhilizhao(赵志立)" wrote:
>>
>>> On Jul 5, 2022, at 8:07 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>>
>>>
>>>
>>> On 2022-07-05 01:20 pm, Zhao Zhili wrote:
>>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>>
>>>> Streams with all zero sample_delta in 'stts' have all zero dts.
>>>> They have higher chance be chose by mov_find_next_sample(), which
>>>> leads to seek again and again.
>>>>
>>>> For example, GoPro created a 'GoPro SOS' stream:
>>>> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
>>>> Metadata:
>>>> creation_time : 2022-06-21T08:49:19.000000Z
>>>> handler_name : GoPro SOS
>>>>
>>>> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
>>>> blocks until all samples in 'GoPro SOS' stream are consumed first.
>>>>
>>>> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
>>>> ---
>>>> libavformat/mov.c | 14 ++++++++++++++
>>>> 1 file changed, 14 insertions(+)
>>>>
>>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>>> index 88669faa70..2a4eb79f27 100644
>>>> --- a/libavformat/mov.c
>>>> +++ b/libavformat/mov.c
>>>> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>> st->nb_frames= total_sample_count;
>>>> if (duration)
>>>> st->duration= FFMIN(st->duration, duration);
>>>> +
>>>> + // All samples have zero duration. They have higher chance be chose by
>>>> + // mov_find_next_sample, which leads to seek again and again.
>>>> + //
>>>> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
>>>> + // So only mark data stream as discarded for safety.
>>>> + if (!duration && sc->stts_count &&
>>>> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
>>>> + av_log(c->fc, AV_LOG_WARNING,
>>>> + "All samples in data stream index:id [%d:%d] have zero duration, "
>>>> + "discard the stream\n",
>>>> + st->index, st->id);
>>>> + st->discard = AVDISCARD_ALL;
>>>> + }
>>>> sc->track_end = duration;
>>>> return 0;
>>>> }
>>> So this will allow audio and video streams to be demuxed, but not data? That distinction seems arbitrary.
>> Disable audio/video streams may create regression. It’s unlikely for random
>> and broken data stream.
>>
>>> Print a warning and assign a duration to each sample. Either 1 or if not zero/Inf, st->duration/st->nb_frames.
>> Set sample_duration to 1 doesn’t work. Dts still far behind other streams.
>>
>> Set sample_duration st->duration/st->nb_frames works for me, but I prefer
>> current strategy for the following reasons:
>>
>> 1. AVDISCARD_ALL is more close to AVERROR_INVALIDDATA by giving up instead
>> of trying correction and hope it works, which may not, e.g., st->duration
>> is broken, or bad interleave even though we fixed sample_duration.
>
> It's not about hoping that it works. It's about not preventing the user from acquiring the stream payload.
>
> Can you test if setting -discard:d none -i INPUT allows reading the stream with your patch?
Yes it does allow reading the stream. ’stts’ box is parsed during
avformat_find_stream_info(), AVStream->discard flag can be modified
after that. The patch has no effect if user changed AVStream->discard
flag.
>
> Regards,
> Gyan
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@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-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-06 2:53 ` "zhilizhao(赵志立)"
@ 2022-07-06 4:09 ` Gyan Doshi
2022-07-06 5:24 ` "zhilizhao(赵志立)"
0 siblings, 1 reply; 11+ messages in thread
From: Gyan Doshi @ 2022-07-06 4:09 UTC (permalink / raw)
To: ffmpeg-devel
On 2022-07-06 08:23 am, "zhilizhao(赵志立)" wrote:
>
>> On Jul 5, 2022, at 10:33 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>
>>
>>
>> On 2022-07-05 07:05 pm, "zhilizhao(赵志立)" wrote:
>>>> On Jul 5, 2022, at 8:07 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>>>
>>>>
>>>>
>>>> On 2022-07-05 01:20 pm, Zhao Zhili wrote:
>>>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>>>
>>>>> Streams with all zero sample_delta in 'stts' have all zero dts.
>>>>> They have higher chance be chose by mov_find_next_sample(), which
>>>>> leads to seek again and again.
>>>>>
>>>>> For example, GoPro created a 'GoPro SOS' stream:
>>>>> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
>>>>> Metadata:
>>>>> creation_time : 2022-06-21T08:49:19.000000Z
>>>>> handler_name : GoPro SOS
>>>>>
>>>>> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
>>>>> blocks until all samples in 'GoPro SOS' stream are consumed first.
>>>>>
>>>>> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
>>>>> ---
>>>>> libavformat/mov.c | 14 ++++++++++++++
>>>>> 1 file changed, 14 insertions(+)
>>>>>
>>>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>>>> index 88669faa70..2a4eb79f27 100644
>>>>> --- a/libavformat/mov.c
>>>>> +++ b/libavformat/mov.c
>>>>> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>>> st->nb_frames= total_sample_count;
>>>>> if (duration)
>>>>> st->duration= FFMIN(st->duration, duration);
>>>>> +
>>>>> + // All samples have zero duration. They have higher chance be chose by
>>>>> + // mov_find_next_sample, which leads to seek again and again.
>>>>> + //
>>>>> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
>>>>> + // So only mark data stream as discarded for safety.
>>>>> + if (!duration && sc->stts_count &&
>>>>> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
>>>>> + av_log(c->fc, AV_LOG_WARNING,
>>>>> + "All samples in data stream index:id [%d:%d] have zero duration, "
>>>>> + "discard the stream\n",
>>>>> + st->index, st->id);
>>>>> + st->discard = AVDISCARD_ALL;
>>>>> + }
>>>>> sc->track_end = duration;
>>>>> return 0;
>>>>> }
>>>> So this will allow audio and video streams to be demuxed, but not data? That distinction seems arbitrary.
>>> Disable audio/video streams may create regression. It’s unlikely for random
>>> and broken data stream.
>>>
>>>> Print a warning and assign a duration to each sample. Either 1 or if not zero/Inf, st->duration/st->nb_frames.
>>> Set sample_duration to 1 doesn’t work. Dts still far behind other streams.
>>>
>>> Set sample_duration st->duration/st->nb_frames works for me, but I prefer
>>> current strategy for the following reasons:
>>>
>>> 1. AVDISCARD_ALL is more close to AVERROR_INVALIDDATA by giving up instead
>>> of trying correction and hope it works, which may not, e.g., st->duration
>>> is broken, or bad interleave even though we fixed sample_duration.
>> It's not about hoping that it works. It's about not preventing the user from acquiring the stream payload.
>>
>> Can you test if setting -discard:d none -i INPUT allows reading the stream with your patch?
> Yes it does allow reading the stream. ’stts’ box is parsed during
> avformat_find_stream_info(), AVStream->discard flag can be modified
> after that. The patch has no effect if user changed AVStream->discard
> flag.
What's the duration of the demuxed stream?
Regards,
Gyan
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-06 4:09 ` Gyan Doshi
@ 2022-07-06 5:24 ` "zhilizhao(赵志立)"
2022-07-06 5:58 ` Gyan Doshi
0 siblings, 1 reply; 11+ messages in thread
From: "zhilizhao(赵志立)" @ 2022-07-06 5:24 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> On Jul 6, 2022, at 12:09 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>
>
>
> On 2022-07-06 08:23 am, "zhilizhao(赵志立)" wrote:
>>
>>> On Jul 5, 2022, at 10:33 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>>
>>>
>>>
>>> On 2022-07-05 07:05 pm, "zhilizhao(赵志立)" wrote:
>>>>> On Jul 5, 2022, at 8:07 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>>>>
>>>>>
>>>>>
>>>>> On 2022-07-05 01:20 pm, Zhao Zhili wrote:
>>>>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>>>>
>>>>>> Streams with all zero sample_delta in 'stts' have all zero dts.
>>>>>> They have higher chance be chose by mov_find_next_sample(), which
>>>>>> leads to seek again and again.
>>>>>>
>>>>>> For example, GoPro created a 'GoPro SOS' stream:
>>>>>> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
>>>>>> Metadata:
>>>>>> creation_time : 2022-06-21T08:49:19.000000Z
>>>>>> handler_name : GoPro SOS
>>>>>>
>>>>>> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
>>>>>> blocks until all samples in 'GoPro SOS' stream are consumed first.
>>>>>>
>>>>>> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
>>>>>> ---
>>>>>> libavformat/mov.c | 14 ++++++++++++++
>>>>>> 1 file changed, 14 insertions(+)
>>>>>>
>>>>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>>>>> index 88669faa70..2a4eb79f27 100644
>>>>>> --- a/libavformat/mov.c
>>>>>> +++ b/libavformat/mov.c
>>>>>> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>>>> st->nb_frames= total_sample_count;
>>>>>> if (duration)
>>>>>> st->duration= FFMIN(st->duration, duration);
>>>>>> +
>>>>>> + // All samples have zero duration. They have higher chance be chose by
>>>>>> + // mov_find_next_sample, which leads to seek again and again.
>>>>>> + //
>>>>>> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
>>>>>> + // So only mark data stream as discarded for safety.
>>>>>> + if (!duration && sc->stts_count &&
>>>>>> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
>>>>>> + av_log(c->fc, AV_LOG_WARNING,
>>>>>> + "All samples in data stream index:id [%d:%d] have zero duration, "
>>>>>> + "discard the stream\n",
>>>>>> + st->index, st->id);
>>>>>> + st->discard = AVDISCARD_ALL;
>>>>>> + }
>>>>>> sc->track_end = duration;
>>>>>> return 0;
>>>>>> }
>>>>> So this will allow audio and video streams to be demuxed, but not data? That distinction seems arbitrary.
>>>> Disable audio/video streams may create regression. It’s unlikely for random
>>>> and broken data stream.
>>>>
>>>>> Print a warning and assign a duration to each sample. Either 1 or if not zero/Inf, st->duration/st->nb_frames.
>>>> Set sample_duration to 1 doesn’t work. Dts still far behind other streams.
>>>>
>>>> Set sample_duration st->duration/st->nb_frames works for me, but I prefer
>>>> current strategy for the following reasons:
>>>>
>>>> 1. AVDISCARD_ALL is more close to AVERROR_INVALIDDATA by giving up instead
>>>> of trying correction and hope it works, which may not, e.g., st->duration
>>>> is broken, or bad interleave even though we fixed sample_duration.
>>> It's not about hoping that it works. It's about not preventing the user from acquiring the stream payload.
>>>
>>> Can you test if setting -discard:d none -i INPUT allows reading the stream with your patch?
>> Yes it does allow reading the stream. ’stts’ box is parsed during
>> avformat_find_stream_info(), AVStream->discard flag can be modified
>> after that. The patch has no effect if user changed AVStream->discard
>> flag.
>
> What's the duration of the demuxed stream?
The demuxed data track has correct duration since there is a check
```
if (duration)
st->duration= FFMIN(st->duration, duration);
```
st->duration comes from ‘mdhd’ and not overwrite in this case.
Every packet has zero as timestamp, as expected:
./ffmpeg -debug_ts -discard:d none -i ~/tmp/gopro.mp4 -map 0:4 -c copy -copy_unknown -f data /tmp/test
demuxer -> ist_index:4 type:data next_dts:0 next_dts_time:0 next_pts:0 next_pts_time:0 pkt_pts:0 pkt_pts_time:0 pkt_dts:0 pkt_dts_time:0 duration:0 duration_time:0 off:0 off_time:0
demuxer+ffmpeg -> ist_index:4 type:data pkt_pts:0 pkt_pts_time:0 pkt_dts:0 pkt_dts_time:0 duration:0 duration_time:0 off:0 off_time:0
muxer <- type:data pkt_pts:0 pkt_pts_time:0 pkt_dts:0 pkt_dts_time:0 duration:0 duration_time:0 size:16
>
> Regards,
> Gyan
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@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-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta
2022-07-06 5:24 ` "zhilizhao(赵志立)"
@ 2022-07-06 5:58 ` Gyan Doshi
2022-07-06 6:59 ` [FFmpeg-devel] [PATCH v2] " Zhao Zhili
2022-07-06 7:05 ` [FFmpeg-devel] [PATCH v3] " Zhao Zhili
0 siblings, 2 replies; 11+ messages in thread
From: Gyan Doshi @ 2022-07-06 5:58 UTC (permalink / raw)
To: ffmpeg-devel
On 2022-07-06 10:54 am, "zhilizhao(赵志立)" wrote:
>
>> On Jul 6, 2022, at 12:09 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>
>>
>>
>> On 2022-07-06 08:23 am, "zhilizhao(赵志立)" wrote:
>>>> On Jul 5, 2022, at 10:33 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>>>
>>>>
>>>>
>>>> On 2022-07-05 07:05 pm, "zhilizhao(赵志立)" wrote:
>>>>>> On Jul 5, 2022, at 8:07 PM, Gyan Doshi <ffmpeg@gyani.pro> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 2022-07-05 01:20 pm, Zhao Zhili wrote:
>>>>>>> From: Zhao Zhili <zhilizhao@tencent.com>
>>>>>>>
>>>>>>> Streams with all zero sample_delta in 'stts' have all zero dts.
>>>>>>> They have higher chance be chose by mov_find_next_sample(), which
>>>>>>> leads to seek again and again.
>>>>>>>
>>>>>>> For example, GoPro created a 'GoPro SOS' stream:
>>>>>>> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
>>>>>>> Metadata:
>>>>>>> creation_time : 2022-06-21T08:49:19.000000Z
>>>>>>> handler_name : GoPro SOS
>>>>>>>
>>>>>>> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
>>>>>>> blocks until all samples in 'GoPro SOS' stream are consumed first.
>>>>>>>
>>>>>>> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
>>>>>>> ---
>>>>>>> libavformat/mov.c | 14 ++++++++++++++
>>>>>>> 1 file changed, 14 insertions(+)
>>>>>>>
>>>>>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>>>>>> index 88669faa70..2a4eb79f27 100644
>>>>>>> --- a/libavformat/mov.c
>>>>>>> +++ b/libavformat/mov.c
>>>>>>> @@ -3062,6 +3062,20 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>>>>> st->nb_frames= total_sample_count;
>>>>>>> if (duration)
>>>>>>> st->duration= FFMIN(st->duration, duration);
>>>>>>> +
>>>>>>> + // All samples have zero duration. They have higher chance be chose by
>>>>>>> + // mov_find_next_sample, which leads to seek again and again.
>>>>>>> + //
>>>>>>> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
>>>>>>> + // So only mark data stream as discarded for safety.
>>>>>>> + if (!duration && sc->stts_count &&
>>>>>>> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
>>>>>>> + av_log(c->fc, AV_LOG_WARNING,
>>>>>>> + "All samples in data stream index:id [%d:%d] have zero duration, "
>>>>>>> + "discard the stream\n",
>>>>>>> + st->index, st->id);
>>>>>>> + st->discard = AVDISCARD_ALL;
>>>>>>> + }
>>>>>>> sc->track_end = duration;
>>>>>>> return 0;
>>>>>>> }
>>>>>> So this will allow audio and video streams to be demuxed, but not data? That distinction seems arbitrary.
>>>>> Disable audio/video streams may create regression. It’s unlikely for random
>>>>> and broken data stream.
>>>>>
>>>>>> Print a warning and assign a duration to each sample. Either 1 or if not zero/Inf, st->duration/st->nb_frames.
>>>>> Set sample_duration to 1 doesn’t work. Dts still far behind other streams.
>>>>>
>>>>> Set sample_duration st->duration/st->nb_frames works for me, but I prefer
>>>>> current strategy for the following reasons:
>>>>>
>>>>> 1. AVDISCARD_ALL is more close to AVERROR_INVALIDDATA by giving up instead
>>>>> of trying correction and hope it works, which may not, e.g., st->duration
>>>>> is broken, or bad interleave even though we fixed sample_duration.
>>>> It's not about hoping that it works. It's about not preventing the user from acquiring the stream payload.
>>>>
>>>> Can you test if setting -discard:d none -i INPUT allows reading the stream with your patch?
>>> Yes it does allow reading the stream. ’stts’ box is parsed during
>>> avformat_find_stream_info(), AVStream->discard flag can be modified
>>> after that. The patch has no effect if user changed AVStream->discard
>>> flag.
>> What's the duration of the demuxed stream?
> The demuxed data track has correct duration since there is a check
> ```
> if (duration)
> st->duration= FFMIN(st->duration, duration);
> ```
> st->duration comes from ‘mdhd’ and not overwrite in this case.
>
> Every packet has zero as timestamp, as expected:
>
> ./ffmpeg -debug_ts -discard:d none -i ~/tmp/gopro.mp4 -map 0:4 -c copy -copy_unknown -f data /tmp/test
>
> demuxer -> ist_index:4 type:data next_dts:0 next_dts_time:0 next_pts:0 next_pts_time:0 pkt_pts:0 pkt_pts_time:0 pkt_dts:0 pkt_dts_time:0 duration:0 duration_time:0 off:0 off_time:0
> demuxer+ffmpeg -> ist_index:4 type:data pkt_pts:0 pkt_pts_time:0 pkt_dts:0 pkt_dts_time:0 duration:0 duration_time:0 off:0 off_time:0
> muxer <- type:data pkt_pts:0 pkt_pts_time:0 pkt_dts:0 pkt_dts_time:0 duration:0 duration_time:0 size:16
Ok, change the log from
"discard the stream"
to
"stream set to be discarded. Override using -discard or AVStream->discard"
Regards,
Gyan
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* [FFmpeg-devel] [PATCH v2] avformat/mov: discard data streams with all zero sample_delta
2022-07-06 5:58 ` Gyan Doshi
@ 2022-07-06 6:59 ` Zhao Zhili
2022-07-06 7:05 ` [FFmpeg-devel] [PATCH v3] " Zhao Zhili
1 sibling, 0 replies; 11+ messages in thread
From: Zhao Zhili @ 2022-07-06 6:59 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Zhao Zhili
From: Zhao Zhili <zhilizhao@tencent.com>
Streams with all zero sample_delta in 'stts' have all zero dts.
They have higher chance be chose by mov_find_next_sample(), which
leads to seek again and again.
For example, GoPro created a 'GoPro SOS' stream:
Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
Metadata:
creation_time : 2022-06-21T08:49:19.000000Z
handler_name : GoPro SOS
With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
blocks until all samples in 'GoPro SOS' stream are consumed first.
Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
v2: suggest how to override discard flag in log message.
libavformat/mov.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 88669faa70..a3e4f05481 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3062,6 +3062,21 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st->nb_frames= total_sample_count;
if (duration)
st->duration= FFMIN(st->duration, duration);
+
+ // All samples have zero duration. They have higher chance be chose by
+ // mov_find_next_sample, which leads to seek again and again.
+ //
+ // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
+ // So only mark data stream as discarded for safety.
+ if (!duration && sc->stts_count &&
+ st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
+ av_log(c->fc, AV_LOG_WARNING,
+ "All samples in data stream index:id [%d:%d] have zero "
+ "duration, stream set to be discarded by default. Override "
+ "using AVStream->discard or -discard for ffmpeg\n",
+ st->index, st->id);
+ st->discard = AVDISCARD_ALL;
+ }
sc->track_end = duration;
return 0;
}
--
2.35.3
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* [FFmpeg-devel] [PATCH v3] avformat/mov: discard data streams with all zero sample_delta
2022-07-06 5:58 ` Gyan Doshi
2022-07-06 6:59 ` [FFmpeg-devel] [PATCH v2] " Zhao Zhili
@ 2022-07-06 7:05 ` Zhao Zhili
2022-07-14 11:33 ` "zhilizhao(赵志立)"
1 sibling, 1 reply; 11+ messages in thread
From: Zhao Zhili @ 2022-07-06 7:05 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Zhao Zhili
From: Zhao Zhili <zhilizhao@tencent.com>
Streams with all zero sample_delta in 'stts' have all zero dts.
They have higher chance be chose by mov_find_next_sample(), which
leads to seek again and again.
For example, GoPro created a 'GoPro SOS' stream:
Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
Metadata:
creation_time : 2022-06-21T08:49:19.000000Z
handler_name : GoPro SOS
With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
blocks until all samples in 'GoPro SOS' stream are consumed first.
Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
v3: 'for ffmpeg' -> 'for ffmpeg command.'
v2: suggest how to override discard flag in log message.
libavformat/mov.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 88669faa70..9a24e5effa 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3062,6 +3062,21 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st->nb_frames= total_sample_count;
if (duration)
st->duration= FFMIN(st->duration, duration);
+
+ // All samples have zero duration. They have higher chance be chose by
+ // mov_find_next_sample, which leads to seek again and again.
+ //
+ // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
+ // So only mark data stream as discarded for safety.
+ if (!duration && sc->stts_count &&
+ st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
+ av_log(c->fc, AV_LOG_WARNING,
+ "All samples in data stream index:id [%d:%d] have zero "
+ "duration, stream set to be discarded by default. Override "
+ "using AVStream->discard or -discard for ffmpeg command.\n",
+ st->index, st->id);
+ st->discard = AVDISCARD_ALL;
+ }
sc->track_end = duration;
return 0;
}
--
2.35.3
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [FFmpeg-devel] [PATCH v3] avformat/mov: discard data streams with all zero sample_delta
2022-07-06 7:05 ` [FFmpeg-devel] [PATCH v3] " Zhao Zhili
@ 2022-07-14 11:33 ` "zhilizhao(赵志立)"
0 siblings, 0 replies; 11+ messages in thread
From: "zhilizhao(赵志立)" @ 2022-07-14 11:33 UTC (permalink / raw)
To: FFmpeg development discussions and patches
> On Jul 6, 2022, at 3:05 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
>
> From: Zhao Zhili <zhilizhao@tencent.com>
>
> Streams with all zero sample_delta in 'stts' have all zero dts.
> They have higher chance be chose by mov_find_next_sample(), which
> leads to seek again and again.
>
> For example, GoPro created a 'GoPro SOS' stream:
> Stream #0:4[0x5](eng): Data: none (fdsc / 0x63736466), 13 kb/s (default)
> Metadata:
> creation_time : 2022-06-21T08:49:19.000000Z
> handler_name : GoPro SOS
>
> With 'ffprobe -show_frames http://example.com/gopro.mp4', ffprobe
> blocks until all samples in 'GoPro SOS' stream are consumed first.
>
> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
> ---
> v3: 'for ffmpeg' -> 'for ffmpeg command.'
> v2: suggest how to override discard flag in log message.
> libavformat/mov.c | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 88669faa70..9a24e5effa 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -3062,6 +3062,21 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> st->nb_frames= total_sample_count;
> if (duration)
> st->duration= FFMIN(st->duration, duration);
> +
> + // All samples have zero duration. They have higher chance be chose by
> + // mov_find_next_sample, which leads to seek again and again.
> + //
> + // It's AVERROR_INVALIDDATA actually, but such files exist in the wild.
> + // So only mark data stream as discarded for safety.
> + if (!duration && sc->stts_count &&
> + st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
> + av_log(c->fc, AV_LOG_WARNING,
> + "All samples in data stream index:id [%d:%d] have zero "
> + "duration, stream set to be discarded by default. Override "
> + "using AVStream->discard or -discard for ffmpeg command.\n",
> + st->index, st->id);
> + st->discard = AVDISCARD_ALL;
> + }
> sc->track_end = duration;
> return 0;
> }
Will apply tomorrow if no more comments.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-07-14 11:33 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-05 7:50 [FFmpeg-devel] [PATCH] avformat/mov: discard data streams with all zero sample_delta Zhao Zhili
2022-07-05 12:07 ` Gyan Doshi
2022-07-05 13:35 ` "zhilizhao(赵志立)"
2022-07-05 14:33 ` Gyan Doshi
2022-07-06 2:53 ` "zhilizhao(赵志立)"
2022-07-06 4:09 ` Gyan Doshi
2022-07-06 5:24 ` "zhilizhao(赵志立)"
2022-07-06 5:58 ` Gyan Doshi
2022-07-06 6:59 ` [FFmpeg-devel] [PATCH v2] " Zhao Zhili
2022-07-06 7:05 ` [FFmpeg-devel] [PATCH v3] " Zhao Zhili
2022-07-14 11:33 ` "zhilizhao(赵志立)"
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git