Go to the documentation of this file.
29 #define LONG_BITSTREAM_READER
45 static void permute(uint8_t *dst,
const uint8_t *
src,
const uint8_t permutation[64])
48 for (
i = 0;
i < 64;
i++)
49 dst[
i] = permutation[
src[
i]];
52 #define ALPHA_SHIFT_16_TO_10(alpha_val) (alpha_val >> 6)
53 #define ALPHA_SHIFT_8_TO_10(alpha_val) ((alpha_val << 2) | (alpha_val >> 6))
54 #define ALPHA_SHIFT_16_TO_12(alpha_val) (alpha_val >> 4)
55 #define ALPHA_SHIFT_8_TO_12(alpha_val) ((alpha_val << 4) | (alpha_val >> 4))
58 const int num_bits,
const int decode_precision) {
59 const int mask = (1 << num_bits) - 1;
60 int i, idx,
val, alpha_val;
76 alpha_val = (alpha_val +
val) &
mask;
78 if (decode_precision == 10) {
84 if (decode_precision == 10) {
90 if (idx >= num_coeffs)
96 if (idx +
val > num_coeffs)
97 val = num_coeffs - idx;
99 for (
i = 0;
i <
val;
i++) {
100 if (decode_precision == 10) {
107 for (
i = 0;
i <
val;
i++) {
108 if (decode_precision == 10) {
115 }
while (idx < num_coeffs);
121 if (num_bits == 16) {
131 if (num_bits == 16) {
142 uint8_t idct_permutation[64];
147 case MKTAG(
'a',
'p',
'c',
'o'):
150 case MKTAG(
'a',
'p',
'c',
's'):
153 case MKTAG(
'a',
'p',
'c',
'n'):
156 case MKTAG(
'a',
'p',
'c',
'h'):
159 case MKTAG(
'a',
'p',
'4',
'h'):
163 case MKTAG(
'a',
'p',
'4',
'x'):
173 av_log(avctx,
AV_LOG_DEBUG,
"Auto bitdepth precision. Use 10b decoding based on codec tag.\n");
175 av_log(avctx,
AV_LOG_DEBUG,
"Auto bitdepth precision. Use 12b decoding based on codec tag.\n");
186 ctx->prodsp.idct_permutation_type);
213 ff_dlog(avctx,
"header size %d\n", hdr_size);
214 if (hdr_size > data_size) {
238 ctx->frame_type = (buf[12] >> 2) & 3;
239 ctx->alpha_info = buf[17] & 0xf;
241 if (
ctx->alpha_info > 2) {
247 ff_dlog(avctx,
"frame type %d\n",
ctx->frame_type);
249 if (
ctx->frame_type == 0) {
250 ctx->scan =
ctx->progressive_scan;
252 ctx->scan =
ctx->interlaced_scan;
253 ctx->frame->interlaced_frame = 1;
254 ctx->frame->top_field_first =
ctx->frame_type == 1;
257 if (
ctx->alpha_info) {
272 #define HWACCEL_MAX (CONFIG_PRORES_VIDEOTOOLBOX_HWACCEL)
278 #if CONFIG_PRORES_VIDEOTOOLBOX_HWACCEL
281 *fmtp++ =
ctx->pix_fmt;
300 if(buf + data_size - ptr < 64) {
307 memset(
ctx->qmat_luma, 4, 64);
311 if(buf + data_size - ptr < 64) {
315 permute(
ctx->qmat_chroma,
ctx->prodsp.idct_permutation, ptr);
317 memcpy(
ctx->qmat_chroma,
ctx->qmat_luma, 64);
326 int i, hdr_size, slice_count;
327 unsigned pic_data_size;
328 int log2_slice_mb_width, log2_slice_mb_height;
329 int slice_mb_count, mb_x, mb_y;
330 const uint8_t *data_ptr, *index_ptr;
332 hdr_size = buf[0] >> 3;
333 if (hdr_size < 8 || hdr_size > buf_size) {
338 pic_data_size =
AV_RB32(buf + 1);
339 if (pic_data_size > buf_size) {
344 log2_slice_mb_width = buf[7] >> 4;
345 log2_slice_mb_height = buf[7] & 0xF;
346 if (log2_slice_mb_width > 3 || log2_slice_mb_height) {
348 1 << log2_slice_mb_width, 1 << log2_slice_mb_height);
352 ctx->mb_width = (avctx->
width + 15) >> 4;
354 ctx->mb_height = (avctx->
height + 31) >> 5;
356 ctx->mb_height = (avctx->
height + 15) >> 4;
360 slice_count =
ctx->mb_height * ((
ctx->mb_width >> log2_slice_mb_width) +
363 if (
ctx->slice_count != slice_count || !
ctx->slices) {
365 ctx->slice_count = 0;
369 ctx->slice_count = slice_count;
375 if (hdr_size + slice_count*2 > buf_size) {
381 index_ptr = buf + hdr_size;
382 data_ptr = index_ptr + slice_count*2;
384 slice_mb_count = 1 << log2_slice_mb_width;
388 for (
i = 0;
i < slice_count;
i++) {
391 slice->
data = data_ptr;
392 data_ptr +=
AV_RB16(index_ptr +
i*2);
394 while (
ctx->mb_width - mb_x < slice_mb_count)
395 slice_mb_count >>= 1;
407 mb_x += slice_mb_count;
408 if (mb_x ==
ctx->mb_width) {
409 slice_mb_count = 1 << log2_slice_mb_width;
413 if (data_ptr > buf + buf_size) {
419 if (mb_x || mb_y !=
ctx->mb_height) {
421 mb_y,
ctx->mb_height);
425 return pic_data_size;
428 #define DECODE_CODEWORD(val, codebook, SKIP) \
430 unsigned int rice_order, exp_order, switch_bits; \
431 unsigned int q, buf, bits; \
433 UPDATE_CACHE(re, gb); \
434 buf = GET_CACHE(re, gb); \
437 switch_bits = codebook & 3; \
438 rice_order = codebook >> 5; \
439 exp_order = (codebook >> 2) & 7; \
441 q = 31 - av_log2(buf); \
443 if (q > switch_bits) { \
444 bits = exp_order - switch_bits + (q<<1); \
445 if (bits > FFMIN(MIN_CACHE_BITS, 31)) \
446 return AVERROR_INVALIDDATA; \
447 val = SHOW_UBITS(re, gb, bits) - (1 << exp_order) + \
448 ((switch_bits + 1) << rice_order); \
449 SKIP(re, gb, bits); \
450 } else if (rice_order) { \
451 SKIP_BITS(re, gb, q+1); \
452 val = (q << rice_order) + SHOW_UBITS(re, gb, rice_order); \
453 SKIP(re, gb, rice_order); \
460 #define TOSIGNED(x) (((x) >> 1) ^ (-((x) & 1)))
462 #define FIRST_DC_CB 0xB8
464 static const uint8_t
dc_codebook[7] = { 0x04, 0x28, 0x28, 0x4D, 0x4D, 0x70, 0x70};
467 int blocks_per_slice)
482 for (
i = 1;
i < blocks_per_slice;
i++,
out += 64) {
486 prev_dc += (((
code + 1) >> 1) ^ sign) - sign;
494 static const uint8_t
run_to_cb[16] = { 0x06, 0x06, 0x05, 0x05, 0x04, 0x29, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
495 static const uint8_t
lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C };
498 int16_t *
out,
int blocks_per_slice)
501 int block_mask, sign;
503 int max_coeffs,
i, bits_left;
504 int log2_block_count =
av_log2(blocks_per_slice);
511 max_coeffs = 64 << log2_block_count;
512 block_mask = blocks_per_slice - 1;
514 for (
pos = block_mask;;) {
516 if (!bits_left || (bits_left < 32 && !
SHOW_UBITS(
re, gb, bits_left)))
521 if (
pos >= max_coeffs) {
529 i =
pos >> log2_block_count;
533 out[((
pos & block_mask) << 6) +
ctx->scan[
i]] = ((
level ^ sign) - sign);
541 uint16_t *dst,
int dst_stride,
542 const uint8_t *buf,
unsigned buf_size,
549 int i, blocks_per_slice = slice->
mb_count<<2;
552 for (
i = 0;
i < blocks_per_slice;
i++)
553 ctx->bdsp.clear_block(blocks+(
i<<6));
564 ctx->prodsp.idct_put(dst, dst_stride,
block+(0<<6), qmat);
565 ctx->prodsp.idct_put(dst +8, dst_stride,
block+(1<<6), qmat);
566 ctx->prodsp.idct_put(dst+4*dst_stride , dst_stride,
block+(2<<6), qmat);
567 ctx->prodsp.idct_put(dst+4*dst_stride+8, dst_stride,
block+(3<<6), qmat);
575 uint16_t *dst,
int dst_stride,
576 const uint8_t *buf,
unsigned buf_size,
577 const int16_t *qmat,
int log2_blocks_per_mb)
583 int i, j, blocks_per_slice = slice->
mb_count << log2_blocks_per_mb;
586 for (
i = 0;
i < blocks_per_slice;
i++)
587 ctx->bdsp.clear_block(blocks+(
i<<6));
598 for (j = 0; j < log2_blocks_per_mb; j++) {
599 ctx->prodsp.idct_put(dst, dst_stride,
block+(0<<6), qmat);
600 ctx->prodsp.idct_put(dst+4*dst_stride, dst_stride,
block+(1<<6), qmat);
612 uint16_t *dst,
int dst_stride,
613 const uint8_t *buf,
int buf_size,
614 int blocks_per_slice)
621 for (
i = 0;
i < blocks_per_slice<<2;
i++)
622 ctx->bdsp.clear_block(blocks+(
i<<6));
626 if (
ctx->alpha_info == 2) {
627 ctx->unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 16);
629 ctx->unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 8);
634 for (
i = 0;
i < 16;
i++) {
635 memcpy(dst,
block, 16 * blocks_per_slice *
sizeof(*dst));
636 dst += dst_stride >> 1;
637 block += 16 * blocks_per_slice;
645 const uint8_t *buf = slice->
data;
647 int i, hdr_size, qscale, log2_chroma_blocks_per_mb;
648 int luma_stride, chroma_stride;
649 int y_data_size, u_data_size, v_data_size, a_data_size,
offset;
650 uint8_t *dest_y, *dest_u, *dest_v;
655 uint16_t val_no_chroma;
662 hdr_size = buf[0] >> 3;
663 qscale =
av_clip(buf[1], 1, 224);
664 qscale = qscale > 128 ? qscale - 96 << 2: qscale;
665 y_data_size =
AV_RB16(buf + 2);
666 u_data_size =
AV_RB16(buf + 4);
667 v_data_size = slice->
data_size - y_data_size - u_data_size - hdr_size;
668 if (hdr_size > 7) v_data_size =
AV_RB16(buf + 6);
669 a_data_size = slice->
data_size - y_data_size - u_data_size -
670 v_data_size - hdr_size;
672 if (y_data_size < 0 || u_data_size < 0 || v_data_size < 0
673 || hdr_size+y_data_size+u_data_size+v_data_size > slice->
data_size){
680 for (
i = 0;
i < 64;
i++) {
681 qmat_luma_scaled [
i] =
ctx->qmat_luma [
i] * qscale;
682 qmat_chroma_scaled[
i] =
ctx->qmat_chroma[
i] * qscale;
685 if (
ctx->frame_type == 0) {
689 luma_stride = pic->
linesize[0] << 1;
690 chroma_stride = pic->
linesize[1] << 1;
696 log2_chroma_blocks_per_mb = 2;
699 log2_chroma_blocks_per_mb = 1;
704 dest_u = pic->
data[1] + (slice->
mb_y << 4) * chroma_stride + (slice->
mb_x << mb_x_shift);
705 dest_v = pic->
data[2] + (slice->
mb_y << 4) * chroma_stride + (slice->
mb_x << mb_x_shift);
707 if (
ctx->frame_type &&
ctx->first_field ^
ctx->frame->top_field_first) {
715 buf, y_data_size, qmat_luma_scaled);
721 buf + y_data_size, u_data_size,
722 qmat_chroma_scaled, log2_chroma_blocks_per_mb);
727 buf + y_data_size + u_data_size, v_data_size,
728 qmat_chroma_scaled, log2_chroma_blocks_per_mb);
733 size_t mb_max_x = slice->
mb_count << (mb_x_shift - 1);
738 val_no_chroma = 511 * 4;
740 for (
i = 0;
i < 16; ++
i)
741 for (j = 0; j < mb_max_x; ++j) {
742 *(uint16_t*)(dest_u + (
i * chroma_stride) + (j << 1)) = val_no_chroma;
743 *(uint16_t*)(dest_v + (
i * chroma_stride) + (j << 1)) = val_no_chroma;
748 if (
ctx->alpha_info && pic->
data[3] && a_data_size) {
751 buf + y_data_size + u_data_size + v_data_size,
767 for (
i = 0;
i <
ctx->slice_count;
i++)
772 if (error < ctx->slice_count)
775 return ctx->slices[0].ret;
784 const uint8_t *buf = avpkt->
data;
785 int buf_size = avpkt->
size;
786 int frame_hdr_size, pic_size,
ret;
795 ctx->frame->key_frame = 1;
796 ctx->first_field = 1;
802 if (frame_hdr_size < 0)
803 return frame_hdr_size;
805 buf += frame_hdr_size;
806 buf_size -= frame_hdr_size;
838 buf_size -= pic_size;
840 if (
ctx->frame_type && buf_size > 0 &&
ctx->first_field) {
841 ctx->first_field = 0;
886 #if CONFIG_PRORES_VIDEOTOOLBOX_HWACCEL
static void error(const char *err)
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
#define DECODE_CODEWORD(val, codebook, SKIP)
AVPixelFormat
Pixel format.
#define FF_PROFILE_PRORES_XQ
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[]
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.
#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.
enum AVPixelFormat pix_fmt
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 so the codec calls ff_thread_report set FF_CODEC_CAP_ALLOCATE_PROGRESS in AVCodec caps_internal and use ff_thread_get_buffer() to allocate frames. The frames must then be freed with ff_thread_release_buffer(). Otherwise decode directly into the user-supplied frames. Call ff_thread_report_progress() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
int flags
AV_CODEC_FLAG_*.
static double val(void *priv, double ch)
#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 void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
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 LOCAL_ALIGNED_16(t, v,...)
#define FF_PROFILE_UNKNOWN
static enum AVPixelFormat pix_fmts[]
#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.
static enum AVPixelFormat pix_fmt
#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 LOCAL_ALIGNED_32(t, v,...)
#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)
int(* end_frame)(AVCodecContext *avctx)
Called at the end of each frame or field picture.
@ 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.
#define AV_PIX_FMT_YUV422P10
const AVCodec ff_prores_decoder
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 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() or get_encode_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
#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)
#define OPEN_READER(name, gb)
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
#define AV_PIX_FMT_YUVA444P10
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, enum idct_permutation_type perm_type)
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
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
int(* decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Callback for each slice.
const char * name
Name of the codec implementation.
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 update_thread_context() run it in the next thread. 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
static const uint8_t lev_to_cb[10]
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
void * av_calloc(size_t nmemb, size_t size)
#define HWACCEL_VIDEOTOOLBOX(codec)
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)
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 ff_thread_finish_setup() afterwards. If some code can 't be moved
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
FF_DISABLE_DEPRECATION_WARNINGS enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Wrapper around get_format() for frame-multithreaded codecs.
static av_always_inline int decode_dc_coeffs(GetBitContext *gb, int16_t *out, int blocks_per_slice)
int(* start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Called at the beginning of each frame or field picture.
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').
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, a positive or negative value, which is typically indicating the size in bytes of each pict...
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 MKTAG(a, b, c, d)
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