Go to the documentation of this file.
   58 #define BS_8BIT_PEL     (1 << 1)  
   59 #define BS_KEYFRAME     (1 << 2) 
 
   60 #define BS_MV_Y_HALF    (1 << 4) 
 
   61 #define BS_MV_X_HALF    (1 << 5) 
 
   62 #define BS_NONREF       (1 << 8) 
 
   66 typedef struct Plane {
 
   74 #define CELL_STACK_MAX  20 
  123     static const int8_t 
offsets[8] = { 1, 1, 2, -3, -3, 3, 4, 4 };
 
  124     static const int8_t deltas [8] = { 0, 1, 0,  4,  4, 1, 0, 1 };
 
  128     for (
i = 0; 
i < 8; 
i++) {
 
  130         for (j = 0; j < 128; j++)
 
  157     ctx->width = 
ctx->height = 0;
 
  159     for (p = 0; p < 3; p++) {
 
  162         ctx->planes[p].pixels[0] = 
ctx->planes[p].pixels[1] = 0;
 
  170     int p, chroma_width, chroma_height;
 
  171     int luma_size, chroma_size;
 
  172     ptrdiff_t luma_pitch, chroma_pitch;
 
  174     luma_width  = 
FFALIGN(luma_width , 2);
 
  175     luma_height = 
FFALIGN(luma_height, 2);
 
  177     if (luma_width  < 16 || luma_width  > 640 ||
 
  178         luma_height < 16 || luma_height > 480 ||
 
  179         luma_width  &  1 || luma_height &   1) {
 
  181                luma_width, luma_height);
 
  185     ctx->width  = luma_width ;
 
  186     ctx->height = luma_height;
 
  188     chroma_width  = 
FFALIGN(luma_width  >> 2, 4);
 
  189     chroma_height = 
FFALIGN(luma_height >> 2, 4);
 
  191     luma_pitch   = 
FFALIGN(luma_width,   16);
 
  192     chroma_pitch = 
FFALIGN(chroma_width, 16);
 
  196     luma_size = luma_pitch * (luma_height + 1);
 
  200     chroma_size = chroma_pitch * (chroma_height + 1);
 
  203     for (p = 0; p < 3; p++) {
 
  204         ctx->planes[p].pitch  = !p ? luma_pitch  : chroma_pitch;
 
  205         ctx->planes[p].width  = !p ? luma_width  : chroma_width;
 
  206         ctx->planes[p].height = !p ? luma_height : chroma_height;
 
  208         ctx->planes[p].buffers[0] = 
av_malloc(!p ? luma_size : chroma_size);
 
  209         ctx->planes[p].buffers[1] = 
av_malloc(!p ? luma_size : chroma_size);
 
  211         if (!
ctx->planes[p].buffers[0] || !
ctx->planes[p].buffers[1])
 
  215         memset(
ctx->planes[p].buffers[0], 0x40, 
ctx->planes[p].pitch);
 
  216         memset(
ctx->planes[p].buffers[1], 0x40, 
ctx->planes[p].pitch);
 
  219         ctx->planes[p].pixels[0] = 
ctx->planes[p].buffers[0] + 
ctx->planes[p].pitch;
 
  220         ctx->planes[p].pixels[1] = 
ctx->planes[p].buffers[1] + 
ctx->planes[p].pitch;
 
  221         memset(
ctx->planes[p].pixels[0], 0, 
ctx->planes[p].pitch * 
ctx->planes[p].height);
 
  222         memset(
ctx->planes[p].pixels[1], 0, 
ctx->planes[p].pitch * 
ctx->planes[p].height);
 
  238     int     h, 
w, mv_x, mv_y, 
offset, offset_dst;
 
  242     offset_dst  = (cell->
ypos << 2) * plane->
pitch + (cell->
xpos << 2);
 
  243     dst         = plane->
pixels[
ctx->buf_sel] + offset_dst;
 
  251     if ((cell->
ypos << 2) + mv_y < -1 || (cell->
xpos << 2) + mv_x < 0 ||
 
  255                "Motion vectors point out of the frame.\n");
 
  264     for (
w = cell->
width; 
w > 0;) {
 
  266         if (!((cell->
xpos << 2) & 15) && 
w >= 4) {
 
  267             for (; 
w >= 4; 
src += 16, dst += 16, 
w -= 4)
 
  268                 ctx->hdsp.put_pixels_tab[0][0](dst, 
src, plane->
pitch, 
h);
 
  272         if (!((cell->
xpos << 2) & 7) && 
w >= 2) {
 
  273             ctx->hdsp.put_pixels_tab[1][0](dst, 
src, plane->
pitch, 
h);
 
  278             ctx->hdsp.put_pixels_tab[2][0](dst, 
src, plane->
pitch, 
h);
 
  290 #define AVG_32(dst, src, ref) \ 
  291     AV_WN32A(dst, ((AV_RN32(src) + AV_RN32(ref)) >> 1) & 0x7F7F7F7FUL) 
  293 #define AVG_64(dst, src, ref) \ 
  294     AV_WN64A(dst, ((AV_RN64(src) + AV_RN64(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL) 
  303     a &= 0xFF00FF00FF00FF00ULL;
 
  306     a &= 0x00FF00FF00FF00FFULL;
 
  328     for (; n > 0; dst += row_offset, n--)
 
  344 #define BUFFER_PRECHECK \ 
  345 if (*data_ptr >= last_ptr) \ 
  346     return IV3_OUT_OF_DATA; \ 
  348 #define RLE_BLOCK_COPY \ 
  349     if (cell->mv_ptr || !skip_flag) \ 
  350         copy_block4(dst, ref, row_offset, row_offset, 4 << v_zoom) 
  352 #define RLE_BLOCK_COPY_8 \ 
  353     pix64 = AV_RN64(ref);\ 
  355         pix64 = replicate64(pix64);\ 
  356         fill_64(dst + row_offset, pix64, 7, row_offset);\ 
  357         AVG_64(dst, ref, dst + row_offset);\ 
  359         fill_64(dst, pix64, 8, row_offset) 
  361 #define RLE_LINES_COPY \ 
  362     copy_block4(dst, ref, row_offset, row_offset, num_lines << v_zoom) 
  364 #define RLE_LINES_COPY_M10 \ 
  365     pix64 = AV_RN64(ref);\ 
  366     if (is_top_of_cell) {\ 
  367         pix64 = replicate64(pix64);\ 
  368         fill_64(dst + row_offset, pix64, (num_lines << 1) - 1, row_offset);\ 
  369         AVG_64(dst, ref, dst + row_offset);\ 
  371         fill_64(dst, pix64, num_lines << 1, row_offset) 
  373 #define APPLY_DELTA_4 \ 
  374     AV_WN16A(dst + line_offset    ,\ 
  375              (AV_RN16(ref    ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ 
  376     AV_WN16A(dst + line_offset + 2,\ 
  377              (AV_RN16(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ 
  379         if (is_top_of_cell && !cell->ypos) {\ 
  380             AV_COPY32U(dst, dst + row_offset);\ 
  382             AVG_32(dst, ref, dst + row_offset);\ 
  386 #define APPLY_DELTA_8 \ 
  388     if (is_top_of_cell) { \ 
  389         AV_WN32A(dst + row_offset    , \ 
  390                  (replicate32(AV_RN32(ref    )) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ 
  391         AV_WN32A(dst + row_offset + 4, \ 
  392                  (replicate32(AV_RN32(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ 
  394         AV_WN32A(dst + row_offset    , \ 
  395                  (AV_RN32(ref    ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ 
  396         AV_WN32A(dst + row_offset + 4, \ 
  397                  (AV_RN32(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ 
  402     if (is_top_of_cell && !cell->ypos) {\ 
  403         AV_COPY64U(dst, dst + row_offset);\ 
  405         AVG_64(dst, ref, dst + row_offset); 
  408 #define APPLY_DELTA_1011_INTER \ 
  411                  (AV_RN32(dst                 ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ 
  413                  (AV_RN32(dst + 4             ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ 
  414         AV_WN32A(dst + row_offset    , \ 
  415                  (AV_RN32(dst + row_offset    ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ 
  416         AV_WN32A(dst + row_offset + 4, \ 
  417                  (AV_RN32(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ 
  420                  (AV_RN16(dst                 ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ 
  422                  (AV_RN16(dst + 2             ) + delta_tab->deltas[dyad2]) & 0x7F7F);\ 
  423         AV_WN16A(dst + row_offset    , \ 
  424                  (AV_RN16(dst + row_offset    ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ 
  425         AV_WN16A(dst + row_offset + 2, \ 
  426                  (AV_RN16(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ 
  431                             uint8_t *
block, uint8_t *ref_block,
 
  432                             ptrdiff_t row_offset, 
int h_zoom, 
int v_zoom, 
int mode,
 
  434                             const uint8_t **data_ptr, 
const uint8_t *last_ptr)
 
  436     int           x, y, 
line, num_lines;
 
  440     unsigned int  dyad1, dyad2;
 
  443     int           blk_row_offset, line_offset;
 
  445     blk_row_offset = (row_offset << (2 + v_zoom)) - (cell->
width << 2);
 
  446     line_offset    = v_zoom ? row_offset : 0;
 
  452         for (x = 0; x < cell->
width; x += 1 + h_zoom) {
 
  456             if (rle_blocks > 0) {
 
  472                         delta_tab = 
delta[1];
 
  474                     code = bytestream_get_byte(data_ptr);
 
  476                         if (code < delta_tab->num_dyads) {
 
  478                             dyad1 = bytestream_get_byte(data_ptr);
 
  480                             if (dyad1 >= delta_tab->
num_dyads || dyad1 >= 248)
 
  487                             if (swap_quads[
line & 1])
 
  488                                 FFSWAP(
unsigned int, dyad1, dyad2);
 
  519                             code = bytestream_get_byte(data_ptr);
 
  520                             rle_blocks = (
code & 0x1F) - 1; 
 
  521                             if (
code >= 64 || rle_blocks < 0)
 
  523                             skip_flag = 
code & 0x20;
 
  524                             num_lines = 4 - 
line; 
 
  525                             if (
mode >= 10 || (cell->
mv_ptr || !skip_flag)) {
 
  555                     ref  += row_offset * (num_lines << v_zoom);
 
  556                     dst  += row_offset * (num_lines << v_zoom);
 
  561             block     += 4 << h_zoom;
 
  562             ref_block += 4 << h_zoom;
 
  566         ref_block += blk_row_offset;
 
  567         block     += blk_row_offset;
 
  587                        Plane *plane, 
Cell *cell, 
const uint8_t *data_ptr,
 
  588                        const uint8_t *last_ptr)
 
  590     int           x, mv_x, mv_y, 
mode, vq_index, prim_indx, second_indx;
 
  595     const uint8_t *data_start = data_ptr;
 
  600     vq_index = 
code & 0xF;
 
  609     } 
else if (
mode >= 10) {
 
  621         if ((cell->
ypos << 2) + mv_y < -1 || (cell->
xpos << 2) + mv_x < 0 ||
 
  625                    "Motion vectors point out of the frame.\n");
 
  637         code        = 
ctx->alt_quant[vq_index];
 
  638         prim_indx   = (
code >> 4)  + 
ctx->cb_offset;
 
  639         second_indx = (
code & 0xF) + 
ctx->cb_offset;
 
  641         vq_index += 
ctx->cb_offset;
 
  642         prim_indx = second_indx = vq_index;
 
  645     if (prim_indx >= 24 || second_indx >= 24) {
 
  646         av_log(avctx, 
AV_LOG_ERROR, 
"Invalid VQ table indexes! Primary: %d, secondary: %d!\n",
 
  647                prim_indx, second_indx);
 
  653     swap_quads[0] = second_indx >= 16;
 
  654     swap_quads[1] = prim_indx   >= 16;
 
  658     if (vq_index >= 8 && ref_block) {
 
  659         for (x = 0; x < cell->
width << 2; x++)
 
  660             ref_block[x] = 
requant_tab[vq_index & 7][ref_block[x] & 127];
 
  675         zoom_fac = 
mode >= 3;
 
  678                                  &data_ptr, last_ptr);
 
  685                                      &data_ptr, last_ptr);
 
  692             zoom_fac = 
mode == 10;
 
  695                                      &data_ptr, last_ptr);
 
  705         av_log(avctx, 
AV_LOG_ERROR, 
"Mode %d: RLE code %X is not allowed at the current line\n",
 
  722     return data_ptr - data_start; 
 
  735 #define SPLIT_CELL(size, new_size) (new_size) = ((size) > 2) ? ((((size) + 2) >> 2) << 1) : 1 
  737 #define UPDATE_BITPOS(n) \ 
  738     ctx->skip_bits  += (n); \ 
  741 #define RESYNC_BITSTREAM \ 
  742     if (ctx->need_resync && !(get_bits_count(&ctx->gb) & 7)) { \ 
  743         skip_bits_long(&ctx->gb, ctx->skip_bits);              \ 
  744         ctx->skip_bits   = 0;                                  \ 
  745         ctx->need_resync = 0;                                  \ 
  749     if (curr_cell.xpos + curr_cell.width > (plane->width >> 2) ||               \ 
  750         curr_cell.ypos + curr_cell.height > (plane->height >> 2)) {             \ 
  751         av_log(avctx, AV_LOG_ERROR, "Invalid cell: x=%d, y=%d, w=%d, h=%d\n",   \ 
  752                curr_cell.xpos, curr_cell.ypos, curr_cell.width, curr_cell.height); \ 
  753         return AVERROR_INVALIDDATA;                                                              \ 
  759                          const int depth, 
const int strip_width)
 
  769     curr_cell = *ref_cell; 
 
  777         if (curr_cell.
width > strip_width) {
 
  779             curr_cell.
width = (curr_cell.
width <= (strip_width << 1) ? 1 : 2) * strip_width;
 
  784         if (ref_cell->
width <= 0 || curr_cell.
width <= 0)
 
  797             if (!curr_cell.
tree) { 
 
  819             if (!curr_cell.
tree) { 
 
  822                 if (!
ctx->need_resync)
 
  824                 if (
ctx->next_cell_data >= 
ctx->last_byte) {
 
  828                 mv_idx = *(
ctx->next_cell_data++);
 
  829                 if (mv_idx >= 
ctx->num_vectors) {
 
  833                 curr_cell.
mv_ptr = &
ctx->mc_vectors[mv_idx << 1];
 
  837                 if (!
ctx->need_resync)
 
  842                                          ctx->next_cell_data, 
ctx->last_byte);
 
  847                 ctx->next_cell_data += bytes_used;
 
  863     unsigned        num_vectors;
 
  867     num_vectors = bytestream_get_le32(&
data); data_size -= 4;
 
  868     if (num_vectors > 256) {
 
  870                "Read invalid number of motion vectors %d\n", num_vectors);
 
  873     if (num_vectors * 2 > data_size)
 
  876     ctx->num_vectors = num_vectors;
 
  877     ctx->mc_vectors  = num_vectors ? 
data : 0;
 
  882     ctx->need_resync = 0;
 
  884     ctx->last_byte = 
data + data_size;
 
  887     curr_cell.
xpos   = curr_cell.
ypos = 0;
 
  897 #define OS_HDR_ID   MKBETAG('F', 'R', 'M', 'H') 
  900                                 const uint8_t *buf, 
int buf_size)
 
  903     const uint8_t   *bs_hdr;
 
  904     uint32_t        frame_num, word2, check_sum, data_size;
 
  905     int             y_offset, u_offset, v_offset;
 
  906     uint32_t        starts[3], ends[3];
 
  913     frame_num = bytestream2_get_le32(&gb);
 
  914     word2     = bytestream2_get_le32(&gb);
 
  915     check_sum = bytestream2_get_le32(&gb);
 
  916     data_size = bytestream2_get_le32(&gb);
 
  918     if ((frame_num ^ word2 ^ data_size ^ 
OS_HDR_ID) != check_sum) {
 
  926     if (bytestream2_get_le16(&gb) != 32) {
 
  931     ctx->frame_num   =  frame_num;
 
  932     ctx->frame_flags =  bytestream2_get_le16(&gb);
 
  933     ctx->data_size   = (bytestream2_get_le32(&gb) + 7) >> 3;
 
  934     ctx->cb_offset   =  bytestream2_get_byte(&gb);
 
  936     if (
ctx->data_size == 16)
 
  938     ctx->data_size = 
FFMIN(
ctx->data_size, buf_size - 16);
 
  943     height = bytestream2_get_le16(&gb);
 
  944     width  = bytestream2_get_le16(&gb);
 
  951         ff_dlog(avctx, 
"Frame dimensions changed!\n");
 
  953         if (width  < 16 || width  > 640 ||
 
  954             height < 16 || height > 480 ||
 
  957                    "Invalid picture dimensions: %d x %d!\n", 
width, 
height);
 
  967     y_offset = bytestream2_get_le32(&gb);
 
  968     v_offset = bytestream2_get_le32(&gb);
 
  969     u_offset = bytestream2_get_le32(&gb);
 
  974     starts[0] = y_offset;
 
  975     starts[1] = v_offset;
 
  976     starts[2] = u_offset;
 
  978     for (j = 0; j < 3; j++) {
 
  979         ends[j] = 
ctx->data_size;
 
  980         for (
i = 2; 
i >= 0; 
i--)
 
  981             if (starts[
i] < ends[j] && starts[
i] > starts[j])
 
  985     ctx->y_data_size = ends[0] - starts[0];
 
  986     ctx->v_data_size = ends[1] - starts[1];
 
  987     ctx->u_data_size = ends[2] - starts[2];
 
  988     if (
FFMIN3(y_offset, v_offset, u_offset) < 0 ||
 
  989         FFMAX3(y_offset, v_offset, u_offset) >= 
ctx->data_size - 16 ||
 
  990         FFMIN3(y_offset, v_offset, u_offset) < gb.
buffer - bs_hdr + 16 ||
 
  996     ctx->y_data_ptr = bs_hdr + y_offset;
 
  997     ctx->v_data_ptr = bs_hdr + v_offset;
 
  998     ctx->u_data_ptr = bs_hdr + u_offset;
 
 1001     if (
ctx->data_size == 16) {
 
 1031                          ptrdiff_t dst_pitch, 
int dst_height)
 
 1034     const uint8_t   *
src  = plane->
pixels[buf_sel];
 
 1035     ptrdiff_t       pitch = plane->
pitch;
 
 1038     for (y = 0; y < dst_height; y++) {
 
 1040         for (x = 0; x < plane->
width >> 2; x++) {
 
 1046         for (x <<= 2; x < plane->
width; x++)
 
 1047             *dst++ = *
src++ << 1;
 
 1050         dst += dst_pitch - plane->
width;
 
 1075     const uint8_t *buf = avpkt->
data;
 
 1076     int buf_size       = avpkt->
size;
 
 1121                  (avctx->
height + 3) >> 2);
 
 1124                  (avctx->
height + 3) >> 2);
 
  
@ RLE_ESC_FA
INTRA: skip block, INTER: copy data from reference.
 
static void error(const char *err)
 
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
 
static const vqEntry vq_tab[24]
 
#define BS_NONREF
nonref (discardable) frame indicator
 
static int get_bits_left(GetBitContext *gb)
 
@ RLE_ESC_FC
same as RLE_ESC_FD + do the same with next block
 
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
 
@ RLE_ESC_FB
apply null delta to N blocks / skip N blocks
 
int16_t height
cell height in 4x4 blocks
 
static int get_bits_count(const GetBitContext *s)
 
static av_cold int decode_close(AVCodecContext *avctx)
 
This structure describes decoded (raw) audio or video data.
 
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
 
#define BS_MV_Y_HALF
vertical mv halfpel resolution indicator
 
@ RLE_ESC_FE
apply null delta to all lines up to the 3rd line
 
static int decode_frame_headers(Indeo3DecodeContext *ctx, AVCodecContext *avctx, const uint8_t *buf, int buf_size)
 
@ RLE_ESC_F9
same as RLE_ESC_FA + do the same with next block
 
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
 
const uint8_t * alt_quant
secondary VQ table set for the modes 1 and 4
 
#define BS_MV_X_HALF
horizontal mv halfpel resolution indicator
 
static int decode_cell(Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, Cell *cell, const uint8_t *data_ptr, const uint8_t *last_ptr)
Decode a vector-quantized cell.
 
const int8_t * mc_vectors
 
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 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 av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
 
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
 
static int decode_cell_data(Indeo3DecodeContext *ctx, Cell *cell, uint8_t *block, uint8_t *ref_block, ptrdiff_t row_offset, int h_zoom, int v_zoom, int mode, const vqEntry *delta[2], int swap_quads[2], const uint8_t **data_ptr, const uint8_t *last_ptr)
 
int16_t xpos
cell coordinates in 4x4 blocks
 
AVCodec p
The public AVCodec.
 
enum AVDiscard skip_frame
Skip decoding for selected frames.
 
static uint8_t requant_tab[8][128]
 
int flags
AV_CODEC_FLAG_*.
 
#define BS_BUFFER
indicates which of two frame buffers should be used
 
static int ff_thread_once(char *control, void(*routine)(void))
 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
 
static av_cold void build_requant_tab(void)
 
#define FF_CODEC_DECODE_CB(func)
 
static const int offsets[]
 
uint8_t buf_sel
active frame buffer: 0 - primary, 1 -secondary
 
static int copy_cell(Indeo3DecodeContext *ctx, Plane *plane, Cell *cell)
Copy pixels of the cell(x + mv_x, y + mv_y) from the previous frame into the cell(x,...
 
#define RLE_LINES_COPY_M10
 
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
 
static av_cold int decode_init(AVCodecContext *avctx)
 
#define BS_KEYFRAME
intra frame indicator
 
#define CODEC_LONG_NAME(str)
 
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
 
static int parse_bintree(Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, int code, Cell *ref_cell, const int depth, const int strip_width)
 
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
 
const uint8_t * y_data_ptr
 
const uint8_t * next_cell_data
 
unsigned num_vectors
number of motion vectors in mc_vectors
 
const uint8_t * u_data_ptr
 
const uint8_t * last_byte
 
#define SPLIT_CELL(size, new_size)
 
uint8_t * pixels[2]
pointer to the actual pixel data of the buffers above
 
int16_t width
cell width in 4x4 blocks
 
@ AVDISCARD_NONKEY
discard all frames except keyframes
 
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
 
int(* init)(AVBSFContext *ctx)
 
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
 
uint8_t cb_offset
needed for selecting VQ tables
 
static int decode_plane(Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, const uint8_t *data, int32_t data_size, int32_t strip_width)
 
const uint8_t * v_data_ptr
 
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
 
static av_cold int allocate_frame_buffers(Indeo3DecodeContext *ctx, AVCodecContext *avctx, int luma_width, int luma_height)
 
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
 
static int is_first_row(const VVCFrameContext *fc, const int rx, const int ry)
 
@ RLE_ESC_FF
apply null delta to all lines up to the 2nd line
 
int data_size
size of the frame data in bytes
 
#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
 
uint8_t num_dyads
number of two-pixel deltas
 
const char * name
Name of the codec implementation.
 
const int8_t * mv_ptr
ptr to the motion vector if any
 
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
 
#define FFSWAP(type, a, b)
 
uint32_t frame_num
current frame number (zero-based)
 
static uint64_t replicate64(uint64_t a)
 
static av_cold void free_frame_buffers(Indeo3DecodeContext *ctx)
 
#define BS_8BIT_PEL
8-bit pixel bitdepth indicator
 
main external API structure.
 
#define APPLY_DELTA_1011_INTER
 
@ RLE_ESC_FD
apply null delta to all remaining lines of this block
 
static void output_plane(const Plane *plane, int buf_sel, uint8_t *dst, ptrdiff_t dst_pitch, int dst_height)
Convert and output the current plane.
 
static int ref[MAX_W *MAX_W]
 
uint8_t tree
tree id: 0- MC tree, 1 - VQ tree
 
#define avpriv_request_sample(...)
 
static uint32_t replicate32(uint32_t a)
 
This structure stores compressed data.
 
int width
picture width / height.
 
const FFCodec ff_indeo3_decoder
 
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
 
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
 
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
 
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.
 
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
 
@ AVDISCARD_NONREF
discard all non reference
 
uint16_t frame_flags
frame properties
 
uint8_t quad_exp
log2 of four-pixel deltas
 
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
 
static void fill_64(uint8_t *dst, const uint64_t pix, int32_t n, int32_t row_offset)