History

avcodec/libuavs3d: process extradata

Zhao Zhili committed 1 year ago

Commit 5a324961 parent 2d7966a1 file · +89 −31Browse files

Unified · Split

libavcodec/libuavs3d.c+89−31
@@ -106,6 +106,91 @@ FF_ENABLE_DEPRECATION_WARNINGS · 105 unmodified lines
106 uavs3d_img_cpy_cvt(&frm_out, dec_frame, dec_frame->bit_depth);106 uavs3d_img_cpy_cvt(&frm_out, dec_frame, dec_frame->bit_depth);
107}107}
108 108
109#define UAVS3D_CHECK_INVALID_RANGE(v, l, r) ((v)<(l)||(v)>(r))
110
111static int libuavs3d_on_seq_header(AVCodecContext *avctx)
112{
113 uavs3d_context *h = avctx->priv_data;
114 uavs3d_io_frm_t *frm_dec = &h->dec_frame;
115 struct uavs3d_com_seqh_t *seqh = frm_dec->seqhdr;
116 int ret;
117
118 if (UAVS3D_CHECK_INVALID_RANGE(seqh->frame_rate_code, 0, 15)) {
119 av_log(avctx, AV_LOG_ERROR, "Invalid frame rate code: %d.\n", seqh->frame_rate_code);
120 seqh->frame_rate_code = 3; // default 25 fps
121 } else {
122 avctx->framerate.num = ff_avs3_frame_rate_tab[seqh->frame_rate_code].num;
123 avctx->framerate.den = ff_avs3_frame_rate_tab[seqh->frame_rate_code].den;
124 }
125 avctx->has_b_frames = seqh->output_reorder_delay;
126 avctx->pix_fmt = seqh->bit_depth_internal == 8 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUV420P10LE;
127 ret = ff_set_dimensions(avctx, seqh->horizontal_size, seqh->vertical_size);
128 if (ret < 0)
129 return ret;
130 h->got_seqhdr = 1;
131
132 if (seqh->colour_description) {
133 if (UAVS3D_CHECK_INVALID_RANGE(seqh->colour_primaries, 0, 9) ||
134 UAVS3D_CHECK_INVALID_RANGE(seqh->transfer_characteristics, 0, 14) ||
135 UAVS3D_CHECK_INVALID_RANGE(seqh->matrix_coefficients, 0, 11)) {
136 av_log(avctx, AV_LOG_ERROR,
137 "Invalid colour description: primaries: %d"
138 "transfer characteristics: %d"
139 "matrix coefficients: %d.\n",
140 seqh->colour_primaries,
141 seqh->transfer_characteristics,
142 seqh->matrix_coefficients);
143 } else {
144 avctx->color_primaries = ff_avs3_color_primaries_tab[seqh->colour_primaries];
145 avctx->color_trc = ff_avs3_color_transfer_tab [seqh->transfer_characteristics];
146 avctx->colorspace = ff_avs3_color_matrix_tab [seqh->matrix_coefficients];
147 }
148 }
149
150 return 0;
151}
152
153static int libuavs3d_decode_extradata(AVCodecContext *avctx)
154{
155 uavs3d_context *h = avctx->priv_data;
156 uint8_t *header = avctx->extradata;
157 int header_size = avctx->extradata_size;
158 uavs3d_io_frm_t *frm_dec = &h->dec_frame;
159
160 if (avctx->extradata_size < 4) {
161 av_log(avctx, AV_LOG_WARNING, "Invalid extradata size %d\n",
162 avctx->extradata_size);
163 return 0;
164 }
165
166 if (header[0] == 1) {
167 // Skip configurationVersion and sequence_header_length
168 header += 3;
169 // Also remove library_dependency_idc at the end
170 header_size -= 4;
171 }
172
173 frm_dec->nal_type = 0;
174 frm_dec->pkt_pos = 0;
175 frm_dec->pkt_size = header_size;
176 frm_dec->bs = header;
177 frm_dec->bs_len = header_size;
178 frm_dec->pts = 0;
179 frm_dec->dts = 0;
180 uavs3d_decode(h->dec_handle, frm_dec);
181 if (frm_dec->nal_type == NAL_SEQ_HEADER) {
182 int ret = libuavs3d_on_seq_header(avctx);
183 if (ret < 0)
184 av_log(avctx, AV_LOG_WARNING,
185 "Process sequence header failed, %s\n", av_err2str(ret));
186 } else {
187 av_log(avctx, AV_LOG_WARNING,
188 "Missing sequence header in extradata\n");
189 }
190
191 return 0;
192}
193
109static av_cold int libuavs3d_init(AVCodecContext *avctx)194static av_cold int libuavs3d_init(AVCodecContext *avctx)
110{195{
111 uavs3d_context *h = avctx->priv_data;196 uavs3d_context *h = avctx->priv_data;
@@ -120,6 +205,9 @@ static av_cold int libuavs3d_init(AVCodecContext *avctx) · 8 unmodified lines
120 return AVERROR(ENOMEM);205 return AVERROR(ENOMEM);
121 }206 }
122 207
208 if (avctx->extradata)
209 return libuavs3d_decode_extradata(avctx);
210
123 return 0;211 return 0;
124}212}
125 213
@@ -146,7 +234,6 @@ static void libuavs3d_flush(AVCodecContext * avctx) · 20 unmodified lines
146 }234 }
147}235}
148 236
149#define UAVS3D_CHECK_INVALID_RANGE(v, l, r) ((v)<(l)||(v)>(r))
150static int libuavs3d_decode_frame(AVCodecContext *avctx, AVFrame *frm,237static int libuavs3d_decode_frame(AVCodecContext *avctx, AVFrame *frm,
151 int *got_frame, AVPacket *avpkt)238 int *got_frame, AVPacket *avpkt)
152{239{
@@ -207,38 +294,9 @@ FF_ENABLE_DEPRECATION_WARNINGS · 54 unmodified lines
207 buf_ptr += bs_len;294 buf_ptr += bs_len;
208 295
209 if (frm_dec->nal_type == NAL_SEQ_HEADER) {296 if (frm_dec->nal_type == NAL_SEQ_HEADER) {
210 struct uavs3d_com_seqh_t *seqh = frm_dec->seqhdr;297 ret = libuavs3d_on_seq_header(avctx);
211 if (UAVS3D_CHECK_INVALID_RANGE(seqh->frame_rate_code, 0, 15)) {
212 av_log(avctx, AV_LOG_ERROR, "Invalid frame rate code: %d.\n", seqh->frame_rate_code);
213 seqh->frame_rate_code = 3; // default 25 fps
214 } else {
215 avctx->framerate.num = ff_avs3_frame_rate_tab[seqh->frame_rate_code].num;
216 avctx->framerate.den = ff_avs3_frame_rate_tab[seqh->frame_rate_code].den;
217 }
218 avctx->has_b_frames = seqh->output_reorder_delay;
219 avctx->pix_fmt = seqh->bit_depth_internal == 8 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUV420P10LE;
220 ret = ff_set_dimensions(avctx, seqh->horizontal_size, seqh->vertical_size);
221 if (ret < 0)298 if (ret < 0)
222 return ret;299 return ret;
223 h->got_seqhdr = 1;
224
225 if (seqh->colour_description) {
226 if (UAVS3D_CHECK_INVALID_RANGE(seqh->colour_primaries, 0, 9) ||
227 UAVS3D_CHECK_INVALID_RANGE(seqh->transfer_characteristics, 0, 14) ||
228 UAVS3D_CHECK_INVALID_RANGE(seqh->matrix_coefficients, 0, 11)) {
229 av_log(avctx, AV_LOG_ERROR,
230 "Invalid colour description: primaries: %d"
231 "transfer characteristics: %d"
232 "matrix coefficients: %d.\n",
233 seqh->colour_primaries,
234 seqh->transfer_characteristics,
235 seqh->matrix_coefficients);
236 } else {
237 avctx->color_primaries = ff_avs3_color_primaries_tab[seqh->colour_primaries];
238 avctx->color_trc = ff_avs3_color_transfer_tab [seqh->transfer_characteristics];
239 avctx->colorspace = ff_avs3_color_matrix_tab [seqh->matrix_coefficients];
240 }
241 }
242 }300 }
243 if (frm_dec->got_pic) {301 if (frm_dec->got_pic) {
244 break;302 break;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t