Go to the documentation of this file.
29 #define LONG_BITSTREAM_READER
45 for (
i = 0;
i < 64;
i++)
46 dst[
i] = permutation[
src[
i]];
49 #define ALPHA_SHIFT_16_TO_10(alpha_val) (alpha_val >> 6)
50 #define ALPHA_SHIFT_8_TO_10(alpha_val) ((alpha_val << 2) | (alpha_val >> 6))
51 #define ALPHA_SHIFT_16_TO_12(alpha_val) (alpha_val >> 4)
52 #define ALPHA_SHIFT_8_TO_12(alpha_val) ((alpha_val << 4) | (alpha_val >> 4))
55 const int num_bits,
const int decode_precision) {
56 const int mask = (1 << num_bits) - 1;
57 int i, idx,
val, alpha_val;
73 alpha_val = (alpha_val +
val) &
mask;
75 if (decode_precision == 10) {
81 if (decode_precision == 10) {
87 if (idx >= num_coeffs)
93 if (idx +
val > num_coeffs)
94 val = num_coeffs - idx;
96 for (
i = 0;
i <
val;
i++) {
97 if (decode_precision == 10) {
104 for (
i = 0;
i <
val;
i++) {
105 if (decode_precision == 10) {
112 }
while (idx < num_coeffs);
118 if (num_bits == 16) {
128 if (num_bits == 16) {
144 case MKTAG(
'a',
'p',
'c',
'o'):
147 case MKTAG(
'a',
'p',
'c',
's'):
150 case MKTAG(
'a',
'p',
'c',
'n'):
153 case MKTAG(
'a',
'p',
'c',
'h'):
156 case MKTAG(
'a',
'p',
'4',
'h'):
160 case MKTAG(
'a',
'p',
'4',
'x'):
170 av_log(avctx,
AV_LOG_DEBUG,
"Auto bitdepth precision. Use 10b decoding based on codec tag.\n");
172 av_log(avctx,
AV_LOG_DEBUG,
"Auto bitdepth precision. Use 12b decoding based on codec tag.\n");
183 ctx->prodsp.idct_permutation_type);
207 ff_dlog(avctx,
"header size %d\n", hdr_size);
208 if (hdr_size > data_size) {
232 ctx->frame_type = (
buf[12] >> 2) & 3;
233 ctx->alpha_info =
buf[17] & 0xf;
235 if (
ctx->alpha_info > 2) {
241 ff_dlog(avctx,
"frame type %d\n",
ctx->frame_type);
243 if (
ctx->frame_type == 0) {
244 ctx->scan =
ctx->progressive_scan;
246 ctx->scan =
ctx->interlaced_scan;
247 ctx->frame->interlaced_frame = 1;
248 ctx->frame->top_field_first =
ctx->frame_type == 1;
251 if (
ctx->alpha_info) {
275 if(
buf + data_size - ptr < 64) {
282 memset(
ctx->qmat_luma, 4, 64);
286 if(
buf + data_size - ptr < 64) {
290 permute(
ctx->qmat_chroma,
ctx->prodsp.idct_permutation, ptr);
292 memset(
ctx->qmat_chroma, 4, 64);
301 int i, hdr_size, slice_count;
302 unsigned pic_data_size;
303 int log2_slice_mb_width, log2_slice_mb_height;
304 int slice_mb_count, mb_x, mb_y;
305 const uint8_t *data_ptr, *index_ptr;
307 hdr_size =
buf[0] >> 3;
308 if (hdr_size < 8 || hdr_size > buf_size) {
314 if (pic_data_size > buf_size) {
319 log2_slice_mb_width =
buf[7] >> 4;
320 log2_slice_mb_height =
buf[7] & 0xF;
321 if (log2_slice_mb_width > 3 || log2_slice_mb_height) {
323 1 << log2_slice_mb_width, 1 << log2_slice_mb_height);
327 ctx->mb_width = (avctx->
width + 15) >> 4;
329 ctx->mb_height = (avctx->
height + 31) >> 5;
331 ctx->mb_height = (avctx->
height + 15) >> 4;
335 slice_count =
ctx->mb_height * ((
ctx->mb_width >> log2_slice_mb_width) +
336 av_popcount(
ctx->mb_width & (1 << log2_slice_mb_width) - 1));
338 if (
ctx->slice_count != slice_count || !
ctx->slices) {
340 ctx->slice_count = 0;
344 ctx->slice_count = slice_count;
350 if (hdr_size + slice_count*2 > buf_size) {
356 index_ptr =
buf + hdr_size;
357 data_ptr = index_ptr + slice_count*2;
359 slice_mb_count = 1 << log2_slice_mb_width;
363 for (
i = 0;
i < slice_count;
i++) {
366 slice->
data = data_ptr;
367 data_ptr +=
AV_RB16(index_ptr +
i*2);
369 while (
ctx->mb_width - mb_x < slice_mb_count)
370 slice_mb_count >>= 1;
382 mb_x += slice_mb_count;
383 if (mb_x ==
ctx->mb_width) {
384 slice_mb_count = 1 << log2_slice_mb_width;
388 if (data_ptr >
buf + buf_size) {
394 if (mb_x || mb_y !=
ctx->mb_height) {
396 mb_y,
ctx->mb_height);
400 return pic_data_size;
403 #define DECODE_CODEWORD(val, codebook, SKIP) \
405 unsigned int rice_order, exp_order, switch_bits; \
406 unsigned int q, buf, bits; \
408 UPDATE_CACHE(re, gb); \
409 buf = GET_CACHE(re, gb); \
412 switch_bits = codebook & 3; \
413 rice_order = codebook >> 5; \
414 exp_order = (codebook >> 2) & 7; \
416 q = 31 - av_log2(buf); \
418 if (q > switch_bits) { \
419 bits = exp_order - switch_bits + (q<<1); \
420 if (bits > FFMIN(MIN_CACHE_BITS, 31)) \
421 return AVERROR_INVALIDDATA; \
422 val = SHOW_UBITS(re, gb, bits) - (1 << exp_order) + \
423 ((switch_bits + 1) << rice_order); \
424 SKIP(re, gb, bits); \
425 } else if (rice_order) { \
426 SKIP_BITS(re, gb, q+1); \
427 val = (q << rice_order) + SHOW_UBITS(re, gb, rice_order); \
428 SKIP(re, gb, rice_order); \
435 #define TOSIGNED(x) (((x) >> 1) ^ (-((x) & 1)))
437 #define FIRST_DC_CB 0xB8
442 int blocks_per_slice)
457 for (
i = 1;
i < blocks_per_slice;
i++,
out += 64) {
461 prev_dc += (((
code + 1) >> 1) ^ sign) - sign;
469 static const uint8_t run_to_cb[16] = { 0x06, 0x06, 0x05, 0x05, 0x04, 0x29, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
470 static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C };
473 int16_t *
out,
int blocks_per_slice)
476 int block_mask, sign;
478 int max_coeffs,
i, bits_left;
479 int log2_block_count =
av_log2(blocks_per_slice);
486 max_coeffs = 64 << log2_block_count;
487 block_mask = blocks_per_slice - 1;
489 for (pos = block_mask;;) {
491 if (!bits_left || (bits_left < 32 && !
SHOW_UBITS(
re, gb, bits_left)))
496 if (pos >= max_coeffs) {
504 i = pos >> log2_block_count;
508 out[((pos & block_mask) << 6) +
ctx->scan[
i]] = ((
level ^ sign) - sign);
516 uint16_t *dst,
int dst_stride,
524 int i, blocks_per_slice = slice->
mb_count<<2;
527 for (
i = 0;
i < blocks_per_slice;
i++)
528 ctx->bdsp.clear_block(blocks+(
i<<6));
539 ctx->prodsp.idct_put(dst, dst_stride,
block+(0<<6), qmat);
540 ctx->prodsp.idct_put(dst +8, dst_stride,
block+(1<<6), qmat);
541 ctx->prodsp.idct_put(dst+4*dst_stride , dst_stride,
block+(2<<6), qmat);
542 ctx->prodsp.idct_put(dst+4*dst_stride+8, dst_stride,
block+(3<<6), qmat);
550 uint16_t *dst,
int dst_stride,
552 const int16_t *qmat,
int log2_blocks_per_mb)
558 int i, j, blocks_per_slice = slice->
mb_count << log2_blocks_per_mb;
561 for (
i = 0;
i < blocks_per_slice;
i++)
562 ctx->bdsp.clear_block(blocks+(
i<<6));
573 for (j = 0; j < log2_blocks_per_mb; j++) {
574 ctx->prodsp.idct_put(dst, dst_stride,
block+(0<<6), qmat);
575 ctx->prodsp.idct_put(dst+4*dst_stride, dst_stride,
block+(1<<6), qmat);
587 uint16_t *dst,
int dst_stride,
589 int blocks_per_slice)
596 for (
i = 0;
i < blocks_per_slice<<2;
i++)
597 ctx->bdsp.clear_block(blocks+(
i<<6));
601 if (
ctx->alpha_info == 2) {
602 ctx->unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 16);
604 ctx->unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 8);
609 for (
i = 0;
i < 16;
i++) {
610 memcpy(dst,
block, 16 * blocks_per_slice *
sizeof(*dst));
611 dst += dst_stride >> 1;
612 block += 16 * blocks_per_slice;
622 int i, hdr_size, qscale, log2_chroma_blocks_per_mb;
623 int luma_stride, chroma_stride;
624 int y_data_size, u_data_size, v_data_size, a_data_size;
625 uint8_t *dest_y, *dest_u, *dest_v, *dest_a;
630 uint16_t val_no_chroma;
637 hdr_size =
buf[0] >> 3;
638 qscale = av_clip(
buf[1], 1, 224);
639 qscale = qscale > 128 ? qscale - 96 << 2: qscale;
642 v_data_size = slice->
data_size - y_data_size - u_data_size - hdr_size;
643 if (hdr_size > 7) v_data_size =
AV_RB16(
buf + 6);
644 a_data_size = slice->
data_size - y_data_size - u_data_size -
645 v_data_size - hdr_size;
647 if (y_data_size < 0 || u_data_size < 0 || v_data_size < 0
648 || hdr_size+y_data_size+u_data_size+v_data_size > slice->
data_size){
655 for (
i = 0;
i < 64;
i++) {
656 qmat_luma_scaled [
i] =
ctx->qmat_luma [
i] * qscale;
657 qmat_chroma_scaled[
i] =
ctx->qmat_chroma[
i] * qscale;
660 if (
ctx->frame_type == 0) {
664 luma_stride = pic->
linesize[0] << 1;
665 chroma_stride = pic->
linesize[1] << 1;
671 log2_chroma_blocks_per_mb = 2;
674 log2_chroma_blocks_per_mb = 1;
677 dest_y = pic->
data[0] + (slice->
mb_y << 4) * luma_stride + (slice->
mb_x << 5);
678 dest_u = pic->
data[1] + (slice->
mb_y << 4) * chroma_stride + (slice->
mb_x << mb_x_shift);
679 dest_v = pic->
data[2] + (slice->
mb_y << 4) * chroma_stride + (slice->
mb_x << mb_x_shift);
680 dest_a = pic->
data[3] + (slice->
mb_y << 4) * luma_stride + (slice->
mb_x << 5);
682 if (
ctx->frame_type &&
ctx->first_field ^
ctx->frame->top_field_first) {
690 buf, y_data_size, qmat_luma_scaled);
696 buf + y_data_size, u_data_size,
697 qmat_chroma_scaled, log2_chroma_blocks_per_mb);
702 buf + y_data_size + u_data_size, v_data_size,
703 qmat_chroma_scaled, log2_chroma_blocks_per_mb);
708 size_t mb_max_x = slice->
mb_count << (mb_x_shift - 1);
713 val_no_chroma = 511 * 4;
715 for (
i = 0;
i < 16; ++
i)
716 for (j = 0; j < mb_max_x; ++j) {
717 *(uint16_t*)(dest_u + (
i * chroma_stride) + (j << 1)) = val_no_chroma;
718 *(uint16_t*)(dest_v + (
i * chroma_stride) + (j << 1)) = val_no_chroma;
723 if (
ctx->alpha_info && pic->
data[3] && a_data_size)
725 buf + y_data_size + u_data_size + v_data_size,
740 for (
i = 0;
i <
ctx->slice_count;
i++)
745 if (error < ctx->slice_count)
748 return ctx->slices[0].ret;
758 int buf_size = avpkt->
size;
759 int frame_hdr_size, pic_size,
ret;
768 ctx->frame->key_frame = 1;
769 ctx->first_field = 1;
775 if (frame_hdr_size < 0)
776 return frame_hdr_size;
778 buf += frame_hdr_size;
779 buf_size -= frame_hdr_size;
788 if (
ctx->first_field)
798 buf_size -= pic_size;
800 if (
ctx->frame_type && buf_size > 0 &&
ctx->first_field) {
801 ctx->first_field = 0;
#define AV_LOG_WARNING
Something somehow does not look correct.
#define DECODE_CODEWORD(val, codebook, SKIP)
#define FF_PROFILE_PRORES_XQ
static av_cold int init(AVCodecContext *avctx)
static int get_bits_left(GetBitContext *gb)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
enum AVColorSpace colorspace
YUV colorspace type.
const AVProfile ff_prores_profiles[]
#define MKTAG(a, b, c, d)
av_cold int ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx)
This structure describes decoded (raw) audio or video data.
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
void * av_mallocz_array(size_t nmemb, size_t size)
#define UPDATE_CACHE(name, gb)
#define AV_PIX_FMT_YUVA422P10
const uint8_t ff_prores_progressive_scan[64]
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
int flags
AV_CODEC_FLAG_*.
#define FF_PROFILE_PRORES_LT
#define ALPHA_SHIFT_8_TO_10(alpha_val)
#define AV_PIX_FMT_YUV444P10
static void unpack_alpha(GetBitContext *gb, uint16_t *dst, int num_coeffs, const int num_bits, const int decode_precision)
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const uint16_t mask[17]
#define CLOSE_READER(name, gb)
static int decode_picture_header(AVCodecContext *avctx, const uint8_t *buf, const int buf_size)
static int decode_picture(AVCodecContext *avctx)
#define SHOW_SBITS(name, gb, num)
static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[64])
#define FF_PROFILE_UNKNOWN
#define AV_PIX_FMT_YUVA444P12
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define SKIP_BITS(name, gb, num)
const uint8_t ff_prores_interlaced_scan[64]
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define FF_DECODE_ERROR_INVALID_BITSTREAM
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
static av_always_inline int decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb, int16_t *out, int blocks_per_slice)
@ AV_PICTURE_TYPE_I
Intra.
static unsigned int get_bits1(GetBitContext *s)
static const uint8_t run_to_cb[16]
#define LAST_SKIP_BITS(name, gb, num)
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define AV_PIX_FMT_YUV422P10
static int decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, uint16_t *dst, int dst_stride, const uint8_t *buf, unsigned buf_size, const int16_t *qmat, int log2_blocks_per_mb)
static void error(const char *err)
static int decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, uint16_t *dst, int dst_stride, const uint8_t *buf, unsigned buf_size, const int16_t *qmat)
static const uint8_t dc_codebook[7]
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define FF_PROFILE_PRORES_HQ
#define FF_PROFILE_PRORES_STANDARD
#define AV_PIX_FMT_YUV422P12
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have add an init_thread_copy() which re-allocates them for other threads. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. If there are inter-frame dependencies
#define ALPHA_SHIFT_16_TO_12(alpha_val)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
#define AV_PIX_FMT_YUV444P12
#define ALPHA_SHIFT_8_TO_12(alpha_val)
int skip_alpha
Skip processing alpha if supported by codec.
static av_cold int decode_close(AVCodecContext *avctx)
static int decode_frame_header(ProresContext *ctx, const uint8_t *buf, const int data_size, AVCodecContext *avctx)
const char const char void * val
#define OPEN_READER(name, gb)
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
#define AV_PIX_FMT_YUVA444P10
av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, enum idct_permutation_type perm_type)
static void decode_slice_alpha(ProresContext *ctx, uint16_t *dst, int dst_stride, const uint8_t *buf, int buf_size, int blocks_per_slice)
Decode alpha slice plane.
#define i(width, name, range_min, range_max)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
const char * name
Name of the codec implementation.
static const uint8_t lev_to_cb[10]
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AVCOL_RANGE_MPEG
the normal 219*2^(n-8) "MPEG" YUV ranges
AVCodec ff_prores_decoder
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
#define FF_PROFILE_PRORES_4444
#define FF_PROFILE_PRORES_PROXY
static void unpack_alpha_10(GetBitContext *gb, uint16_t *dst, int num_coeffs, const int num_bits)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
main external API structure.
#define ALPHA_SHIFT_16_TO_10(alpha_val)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
#define SHOW_UBITS(name, gb, num)
#define AV_PIX_FMT_YUVA422P12
static av_always_inline int decode_dc_coeffs(GetBitContext *gb, int16_t *out, int blocks_per_slice)
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
static av_cold int decode_init(AVCodecContext *avctx)
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
#define LOCAL_ALIGNED_16(t, v,...)
This structure stores compressed data.
static void unpack_alpha_12(GetBitContext *gb, uint16_t *dst, int num_coeffs, const int num_bits)
int width
picture width / height.
#define flags(name, subs,...)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define LOCAL_ALIGNED_32(t, v,...)
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16