Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] libavformat/mpegtsenc.c -- correctly re-emit extradata ahead of IDR pictures
@ 2023-01-27 21:18 John Coiner
  2023-01-29 12:30 ` Marton Balint
  0 siblings, 1 reply; 11+ messages in thread
From: John Coiner @ 2023-01-27 21:18 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: John Coiner

From: John Coiner <jcoiner@google.com>

This is the proposed fix for https://trac.ffmpeg.org/ticket/10148

Very sorry to send the same patch 3 times; this time with `git send-email' so it should be legal :)

---
 libavformat/mpegtsenc.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 48d39e6a7d..6cb398f99c 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -1886,17 +1886,21 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
         if (extradd && AV_RB24(st->codecpar->extradata) > 1)
             extradd = 0;
 
-        do {
+        while (p < buf_end
+               && extradd > 0
+               && (state & 0x1f) != 5  // IDR picture
+               && (state & 0x1f) != 1  // non-IDR picture
+               ) {
             p = avpriv_find_start_code(p, buf_end, &state);
             av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f);
-            if ((state & 0x1f) == 7)
+            if ((state & 0x1f) == 7)  // SPS NAL
                 extradd = 0;
-        } while (p < buf_end && (state & 0x1f) != 9 &&
-                 (state & 0x1f) != 5 && (state & 0x1f) != 1);
-
-        if ((state & 0x1f) != 5)
+        }
+        if ((state & 0x1f) != 5) {
+            // Not an IDR picture
             extradd = 0;
-        if ((state & 0x1f) != 9) { // AUD NAL
+        }
+        if (extradd > 0) {
             data = av_malloc(pkt->size + 6 + extradd);
             if (!data)
                 return AVERROR(ENOMEM);
-- 
2.39.1.456.gfc5497dd1b-goog

_______________________________________________
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] libavformat/mpegtsenc.c -- correctly re-emit extradata ahead of IDR pictures
@ 2023-01-31 12:45 John Coiner
  2023-02-05 23:33 ` Marton Balint
  0 siblings, 1 reply; 11+ messages in thread
From: John Coiner @ 2023-01-31 12:45 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: John Coiner

This replaces and obsoletes the earlier version of this patch, which had a bug. Thanks to Marton Balint for spotting it.

This fixes https://trac.ffmpeg.org/ticket/10148, it ensures that each IDR frame is prefixed with SPS/PPS.

Tested manually, with inputs containing AUDs (x264's aud=1 mode) and also without (aud=0) to confirm it still inserts AUDs when necessary, and not otherwise.

---
 libavformat/mpegtsenc.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 48d39e6a7d..64948f4d75 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -1877,6 +1877,7 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
 
     if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
         const uint8_t *p = buf, *buf_end = p + size;
+        uint8_t found_aud = 0;
         uint32_t state = -1;
         int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codecpar->extradata_size : 0;
         int ret = ff_check_h264_startcode(s, st, pkt);
@@ -1886,17 +1887,25 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
         if (extradd && AV_RB24(st->codecpar->extradata) > 1)
             extradd = 0;
 
+        // Ensure that all pictures are prefixed with an AUD, and that
+        // IDR pictures are also prefixed with SPS and PPS. SPS and PPS
+        // are assumed to be available in 'extradata' if not found in-band.
         do {
             p = avpriv_find_start_code(p, buf_end, &state);
             av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f);
-            if ((state & 0x1f) == 7)
+            if ((state & 0x1f) == 7)  // SPS NAL
                 extradd = 0;
-        } while (p < buf_end && (state & 0x1f) != 9 &&
-                 (state & 0x1f) != 5 && (state & 0x1f) != 1);
-
-        if ((state & 0x1f) != 5)
+            if ((state & 0x1f) == 9)  // AUD
+                found_aud = 1;
+        } while (p < buf_end
+                 && (state & 0x1f) != 5  // IDR picture
+                 && (state & 0x1f) != 1  // non-IDR picture
+                 && (extradd > 0 || !found_aud));
+        if ((state & 0x1f) != 5) {
+            // Did not find IDR picture; do not emit extradata.
             extradd = 0;
-        if ((state & 0x1f) != 9) { // AUD NAL
+        }
+        if (extradd > 0 || !found_aud) {
             data = av_malloc(pkt->size + 6 + extradd);
             if (!data)
                 return AVERROR(ENOMEM);
-- 
2.39.1.456.gfc5497dd1b-goog

_______________________________________________
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] libavformat/mpegtsenc.c -- correctly re-emit extradata ahead of IDR pictures
@ 2023-01-30 15:13 John Coiner
  2023-01-30 17:36 ` John Coiner
  0 siblings, 1 reply; 11+ messages in thread
From: John Coiner @ 2023-01-30 15:13 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: cus

Hi Marton,

Thanks for pointing out
https://patchwork.ffmpeg.org/project/ffmpeg/patch/tencent_EE0E40DE9A569FE5AB454E6E700A2DA79A08@qq.com/

Adding prints to h264_mp4toannexb_bsf.c shows that it's not reached in
the sequence that reproduces bug 10148 so it seems to be unrelated.

I found a simpler process to reproduce bug 10148 with probably any input file:

ffmpeg -i <any_input_media> -vf scale=320:-1 -c:v libx264 -x264-params
aud=1 -c:a aac -f hls -method PUT
'https://upload.youtube.com/http_upload_hls?cid=<your-stream-key>&copy=0&nightly=1&file=out.m3u8'

... where 'youtube.com' can be any HTTP server that accepts PUT,
there's nothing specific to youtube here.

Without the fix, that produces an unjoinable and noncompliant upload
where all HLS media segments after the first are not independently
decodable. With the fix, all are independently decodable.

thanks!

John
_______________________________________________
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] libavformat/mpegtsenc.c -- correctly re-emit extradata ahead of IDR pictures
@ 2023-01-26 19:16 John Coiner
  0 siblings, 0 replies; 11+ messages in thread
From: John Coiner @ 2023-01-26 19:16 UTC (permalink / raw)
  To: ffmpeg-devel

Trying again to upload the same patch, this time inline:

From 09c4bbd3d4ef6fbcb1558fce5cff4d15d7839526 Mon Sep 17 00:00:00 2001
From: John Coiner <jcoiner@google.com>
Date: Thu, 26 Jan 2023 13:34:24 -0500
Subject: [PATCH] Proposed fix for https://trac.ffmpeg.org/ticket/10148

---
 libavformat/mpegtsenc.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 48d39e6a7d..6cb398f99c 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -1886,17 +1886,21 @@ static int
mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
         if (extradd && AV_RB24(st->codecpar->extradata) > 1)
             extradd = 0;

-        do {
+        while (p < buf_end
+               && extradd > 0
+               && (state & 0x1f) != 5  // IDR picture
+               && (state & 0x1f) != 1  // non-IDR picture
+               ) {
             p = avpriv_find_start_code(p, buf_end, &state);
             av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f);
-            if ((state & 0x1f) == 7)
+            if ((state & 0x1f) == 7)  // SPS NAL
                 extradd = 0;
-        } while (p < buf_end && (state & 0x1f) != 9 &&
-                 (state & 0x1f) != 5 && (state & 0x1f) != 1);
-
-        if ((state & 0x1f) != 5)
+        }
+        if ((state & 0x1f) != 5) {
+            // Not an IDR picture
             extradd = 0;
-        if ((state & 0x1f) != 9) { // AUD NAL
+        }
+        if (extradd > 0) {
             data = av_malloc(pkt->size + 6 + extradd);
             if (!data)
                 return AVERROR(ENOMEM);
-- 
2.39.1.456.gfc5497dd1b-goog
_______________________________________________
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] libavformat/mpegtsenc.c -- correctly re-emit extradata ahead of IDR pictures
@ 2023-01-26 18:43 John Coiner
  0 siblings, 0 replies; 11+ messages in thread
From: John Coiner @ 2023-01-26 18:43 UTC (permalink / raw)
  To: ffmpeg-devel

A proposed fix for https://trac.ffmpeg.org/attachment/ticket/10148 is
attached to the bug, here:

https://trac.ffmpeg.org/attachment/ticket/10148/0001-Proposed-fix-for-https-trac.ffmpeg.org-ticket-10148.patch
_______________________________________________
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:[~2023-02-11 16:39 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-27 21:18 [FFmpeg-devel] [PATCH] libavformat/mpegtsenc.c -- correctly re-emit extradata ahead of IDR pictures John Coiner
2023-01-29 12:30 ` Marton Balint
  -- strict thread matches above, loose matches on Subject: below --
2023-01-31 12:45 John Coiner
2023-02-05 23:33 ` Marton Balint
2023-02-11 16:38   ` John Coiner
2023-01-30 15:13 John Coiner
2023-01-30 17:36 ` John Coiner
2023-01-30 21:12   ` Marton Balint
2023-02-02 17:43     ` John Coiner
2023-01-26 19:16 John Coiner
2023-01-26 18:43 John Coiner

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