From: James Almer <jamrial@gmail.com>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH 1/3 v3] avformat/vvc: fix writing general_constraint_info bytes
Date: Fri, 17 May 2024 10:42:26 -0300
Message-ID: <20240517134228.288-1-jamrial@gmail.com> (raw)
The existing implementation was completely broken.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/Makefile | 2 +-
libavformat/bitstream.c | 1 +
libavformat/vvc.c | 38 ++++++++++++++++++++------------------
tests/ref/fate/source | 1 +
4 files changed, 23 insertions(+), 19 deletions(-)
create mode 100644 libavformat/bitstream.c
diff --git a/libavformat/Makefile b/libavformat/Makefile
index 2d4e0e0c95..211ccf45e5 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -727,7 +727,7 @@ OBJS-$(CONFIG_LIBSSH_PROTOCOL) += libssh.o
OBJS-$(CONFIG_LIBZMQ_PROTOCOL) += libzmq.o
# Objects duplicated from other libraries for shared builds
-SHLIBOBJS += log2_tab.o to_upper4.o
+SHLIBOBJS += log2_tab.o to_upper4.o bitstream.o
SHLIBOBJS-$(CONFIG_ISO_MEDIA) += mpegaudiotabs.o
SHLIBOBJS-$(CONFIG_FLV_MUXER) += mpeg4audio_sample_rates.o
SHLIBOBJS-$(CONFIG_HLS_DEMUXER) += ac3_channel_layout_tab.o
diff --git a/libavformat/bitstream.c b/libavformat/bitstream.c
new file mode 100644
index 0000000000..2afda37c30
--- /dev/null
+++ b/libavformat/bitstream.c
@@ -0,0 +1 @@
+#include "libavcodec/bitstream.c"
diff --git a/libavformat/vvc.c b/libavformat/vvc.c
index 3123cd8d83..98177a7ad8 100644
--- a/libavformat/vvc.c
+++ b/libavformat/vvc.c
@@ -21,6 +21,7 @@
*/
#include "libavcodec/get_bits.h"
+#include "libavcodec/put_bits.h"
#include "libavcodec/golomb.h"
#include "libavcodec/vvc.h"
#include "libavutil/intreadwrite.h"
@@ -138,9 +139,8 @@ static void vvcc_update_ptl(VVCDecoderConfigurationRecord *vvcc,
vvcc->ptl.num_bytes_constraint_info = 9;
memcpy(&vvcc->ptl.general_constraint_info[0],
&ptl->gci_general_constraints[0], sizeof(uint8_t) * 9);
-
} else {
- vvcc->ptl.num_bytes_constraint_info = 1;
+ vvcc->ptl.num_bytes_constraint_info = 0;
memset(&vvcc->ptl.general_constraint_info[0], 0, sizeof(uint8_t) * 9);
}
@@ -185,7 +185,7 @@ static void vvcc_parse_ptl(GetBitContext *gb,
unsigned int profileTierPresentFlag,
unsigned int max_sub_layers_minus1)
{
- VVCCProfileTierLevel general_ptl;
+ VVCCProfileTierLevel general_ptl = { 0 };
int j;
if (profileTierPresentFlag) {
@@ -326,6 +326,7 @@ static int vvcc_parse_vps(GetBitContext *gb,
for (int i = 0; i <= vps_num_ptls_minus1; i++)
vvcc_parse_ptl(gb, vvcc, vps_pt_present_flag[i], vps_ptl_max_tid[i]);
+ vvcc->ptl_present_flag = 1;
/* nothing useful for vvcc past this point */
return 0;
@@ -356,8 +357,10 @@ static int vvcc_parse_sps(GetBitContext *gb,
vvcc->chroma_format_idc = get_bits(gb, 2);
sps_log2_ctu_size_minus5 = get_bits(gb, 2);
- if (get_bits1(gb)) // sps_ptl_dpb_hrd_params_present_flag
+ if (get_bits1(gb)) { // sps_ptl_dpb_hrd_params_present_flag
+ vvcc->ptl_present_flag = 1;
vvcc_parse_ptl(gb, vvcc, 1, sps_max_sublayers_minus1);
+ }
skip_bits1(gb); // sps_gdr_enabled_flag
if (get_bits(gb, 1)) // sps_ref_pic_resampling_enabled_flag
@@ -579,10 +582,6 @@ static void vvcc_init(VVCDecoderConfigurationRecord *vvcc)
{
memset(vvcc, 0, sizeof(VVCDecoderConfigurationRecord));
vvcc->lengthSizeMinusOne = 3; // 4 bytes
-
- vvcc->ptl.num_bytes_constraint_info = 1;
-
- vvcc->ptl_present_flag = 1;
}
static void vvcc_close(VVCDecoderConfigurationRecord *vvcc)
@@ -603,7 +602,6 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc)
{
uint8_t i;
uint16_t j, vps_count = 0, sps_count = 0, pps_count = 0;
- unsigned char *buf = NULL;
/*
* It's unclear how to properly compute these fields, so
* let's always set them to values meaning 'unspecified'.
@@ -735,6 +733,10 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc)
avio_w8(pb, vvcc->lengthSizeMinusOne << 1 | vvcc->ptl_present_flag | 0xf8);
if (vvcc->ptl_present_flag) {
+ uint8_t buf[64];
+ PutBitContext pbc;
+
+ init_put_bits(&pbc, buf, sizeof(buf));
/*
* unsigned int(9) ols_idx;
* unsigned int(3) num_sublayers;
@@ -766,15 +768,15 @@ static int vvcc_write(AVIOContext *pb, VVCDecoderConfigurationRecord *vvcc)
* unsigned int (1) ptl_frame_only_constraint_flag
* unsigned int (1) ptl_multilayer_enabled_flag
* unsigned int (8*num_bytes_constraint_info -2) general_constraint_info */
- buf =
- (unsigned char *) malloc(sizeof(unsigned char) *
- vvcc->ptl.num_bytes_constraint_info);
- *buf = vvcc->ptl.ptl_frame_only_constraint_flag << vvcc->ptl.
- num_bytes_constraint_info * 8 - 1 | vvcc->ptl.
- ptl_multilayer_enabled_flag << vvcc->ptl.num_bytes_constraint_info *
- 8 - 2 | *vvcc->ptl.general_constraint_info >> 2;
- avio_write(pb, buf, vvcc->ptl.num_bytes_constraint_info);
- free(buf);
+ put_bits(&pbc, 1, vvcc->ptl.ptl_frame_only_constraint_flag);
+ put_bits(&pbc, 1, vvcc->ptl.ptl_multilayer_enabled_flag);
+ if (vvcc->ptl.num_bytes_constraint_info) {
+ ff_copy_bits(&pbc, vvcc->ptl.general_constraint_info, (vvcc->ptl.num_bytes_constraint_info - 1) * 8);
+ put_bits(&pbc, 6, vvcc->ptl.general_constraint_info[vvcc->ptl.num_bytes_constraint_info - 1] & 0x3f);
+ } else
+ put_bits(&pbc, 6, 0);
+ flush_put_bits(&pbc);
+ avio_write(pb, buf, put_bytes_count(&pbc, 1));
if (vvcc->num_sublayers > 1) {
uint8_t ptl_sublayer_level_present_flags = 0;
diff --git a/tests/ref/fate/source b/tests/ref/fate/source
index 7b5f14b4f0..d8d4224145 100644
--- a/tests/ref/fate/source
+++ b/tests/ref/fate/source
@@ -10,6 +10,7 @@ libavdevice/reverse.c
libavfilter/af_arnndn.c
libavfilter/file_open.c
libavfilter/log2_tab.c
+libavformat/bitstream.c
libavformat/file_open.c
libavformat/golomb_tab.c
libavformat/log2_tab.c
--
2.45.1
_______________________________________________
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".
next reply other threads:[~2024-05-17 13:43 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-17 13:42 James Almer [this message]
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 2/3] avformat/vvc: include additional bits in general_constraint_info James Almer
2024-05-17 13:42 ` [FFmpeg-devel] [PATCH 3/3] configure: split ISOBMFF writer helpers into a separate component James Almer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240517134228.288-1-jamrial@gmail.com \
--to=jamrial@gmail.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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