dvdec.c
Go to the documentation of this file.
1 /*
2  * DV decoder
3  * Copyright (c) 2002 Fabrice Bellard
4  * Copyright (c) 2004 Roman Shaposhnik
5  *
6  * 50 Mbps (DVCPRO50) support
7  * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
8  *
9  * 100 Mbps (DVCPRO HD) support
10  * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D)
11  * Final code by Roman Shaposhnik
12  *
13  * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
14  * of DV technical info.
15  *
16  * This file is part of FFmpeg.
17  *
18  * FFmpeg is free software; you can redistribute it and/or
19  * modify it under the terms of the GNU Lesser General Public
20  * License as published by the Free Software Foundation; either
21  * version 2.1 of the License, or (at your option) any later version.
22  *
23  * FFmpeg is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26  * Lesser General Public License for more details.
27  *
28  * You should have received a copy of the GNU Lesser General Public
29  * License along with FFmpeg; if not, write to the Free Software
30  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31  */
32 
33 /**
34  * @file
35  * DV decoder
36  */
37 
38 #include "libavutil/avassert.h"
39 #include "libavutil/internal.h"
40 #include "libavutil/pixdesc.h"
41 #include "avcodec.h"
42 #include "internal.h"
43 #include "get_bits.h"
44 #include "put_bits.h"
45 #include "simple_idct.h"
46 #include "dvdata.h"
47 
48 typedef struct BlockInfo {
49  const uint32_t *factor_table;
51  uint8_t pos; /* position in block */
52  void (*idct_put)(uint8_t *dest, int line_size, int16_t *block);
56 } BlockInfo;
57 
58 static const int dv_iweight_bits = 14;
59 
60 /* decode AC coefficients */
61 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
62 {
63  int last_index = gb->size_in_bits;
64  const uint8_t *scan_table = mb->scan_table;
65  const uint32_t *factor_table = mb->factor_table;
66  int pos = mb->pos;
68  int level, run, vlc_len, index;
69 
70  OPEN_READER(re, gb);
71  UPDATE_CACHE(re, gb);
72 
73  /* if we must parse a partial VLC, we do it here */
74  if (partial_bit_count > 0) {
75  re_cache = re_cache >> partial_bit_count | mb->partial_bit_buffer;
76  re_index -= partial_bit_count;
77  mb->partial_bit_count = 0;
78  }
79 
80  /* get the AC coefficients until last_index is reached */
81  for (;;) {
82  av_dlog(NULL, "%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16),
83  re_index);
84  /* our own optimized GET_RL_VLC */
85  index = NEG_USR32(re_cache, TEX_VLC_BITS);
86  vlc_len = ff_dv_rl_vlc[index].len;
87  if (vlc_len < 0) {
88  index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) +
90  vlc_len = TEX_VLC_BITS - vlc_len;
91  }
92  level = ff_dv_rl_vlc[index].level;
93  run = ff_dv_rl_vlc[index].run;
94 
95  /* gotta check if we're still within gb boundaries */
96  if (re_index + vlc_len > last_index) {
97  /* should be < 16 bits otherwise a codeword could have been parsed */
98  mb->partial_bit_count = last_index - re_index;
99  mb->partial_bit_buffer = re_cache & ~(-1u >> mb->partial_bit_count);
100  re_index = last_index;
101  break;
102  }
103  re_index += vlc_len;
104 
105  av_dlog(NULL, "run=%d level=%d\n", run, level);
106  pos += run;
107  if (pos >= 64)
108  break;
109 
110  level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >> dv_iweight_bits;
111  block[scan_table[pos]] = level;
112 
113  UPDATE_CACHE(re, gb);
114  }
115  CLOSE_READER(re, gb);
116  mb->pos = pos;
117 }
118 
119 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
120 {
121  int bits_left = get_bits_left(gb);
122  while (bits_left >= MIN_CACHE_BITS) {
124  bits_left -= MIN_CACHE_BITS;
125  }
126  if (bits_left > 0) {
127  put_bits(pb, bits_left, get_bits(gb, bits_left));
128  }
129 }
130 
131 /* mb_x and mb_y are in units of 8 pixels */
132 static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
133 {
134  DVVideoContext *s = avctx->priv_data;
135  DVwork_chunk *work_chunk = arg;
136  int quant, dc, dct_mode, class1, j;
137  int mb_index, mb_x, mb_y, last_index;
138  int y_stride, linesize;
139  int16_t *block, *block1;
140  int c_offset;
141  uint8_t *y_ptr;
142  const uint8_t *buf_ptr;
143  PutBitContext pb, vs_pb;
144  GetBitContext gb;
145  BlockInfo mb_data[5 * DV_MAX_BPM], *mb, *mb1;
146  LOCAL_ALIGNED_16(int16_t, sblock, [5*DV_MAX_BPM], [64]);
147  LOCAL_ALIGNED_16(uint8_t, mb_bit_buffer, [ 80 + FF_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
148  LOCAL_ALIGNED_16(uint8_t, vs_bit_buffer, [5*80 + FF_INPUT_BUFFER_PADDING_SIZE]); /* allow some slack */
149  const int log2_blocksize = 3-s->avctx->lowres;
150  int is_field_mode[5];
151 
152  av_assert1((((int)mb_bit_buffer) & 7) == 0);
153  av_assert1((((int)vs_bit_buffer) & 7) == 0);
154 
155  memset(sblock, 0, 5*DV_MAX_BPM*sizeof(*sblock));
156 
157  /* pass 1: read DC and AC coefficients in blocks */
158  buf_ptr = &s->buf[work_chunk->buf_offset*80];
159  block1 = &sblock[0][0];
160  mb1 = mb_data;
161  init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
162  for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->sys->bpm, block1 += s->sys->bpm * 64) {
163  /* skip header */
164  quant = buf_ptr[3] & 0x0f;
165  buf_ptr += 4;
166  init_put_bits(&pb, mb_bit_buffer, 80);
167  mb = mb1;
168  block = block1;
169  is_field_mode[mb_index] = 0;
170  for (j = 0; j < s->sys->bpm; j++) {
171  last_index = s->sys->block_sizes[j];
172  init_get_bits(&gb, buf_ptr, last_index);
173 
174  /* get the DC */
175  dc = get_sbits(&gb, 9);
176  dct_mode = get_bits1(&gb);
177  class1 = get_bits(&gb, 2);
178  if (DV_PROFILE_IS_HD(s->sys)) {
179  mb->idct_put = s->idct_put[0];
180  mb->scan_table = s->dv_zigzag[0];
181  mb->factor_table = &s->sys->idct_factor[(j >= 4)*4*16*64 + class1*16*64 + quant*64];
182  is_field_mode[mb_index] |= !j && dct_mode;
183  } else {
184  mb->idct_put = s->idct_put[dct_mode && log2_blocksize == 3];
185  mb->scan_table = s->dv_zigzag[dct_mode];
186  mb->factor_table = &s->sys->idct_factor[(class1 == 3)*2*22*64 + dct_mode*22*64 +
187  (quant + ff_dv_quant_offset[class1])*64];
188  }
189  dc = dc << 2;
190  /* convert to unsigned because 128 is not added in the
191  standard IDCT */
192  dc += 1024;
193  block[0] = dc;
194  buf_ptr += last_index >> 3;
195  mb->pos = 0;
196  mb->partial_bit_count = 0;
197 
198  av_dlog(avctx, "MB block: %d, %d ", mb_index, j);
199  dv_decode_ac(&gb, mb, block);
200 
201  /* write the remaining bits in a new buffer only if the
202  block is finished */
203  if (mb->pos >= 64)
204  bit_copy(&pb, &gb);
205 
206  block += 64;
207  mb++;
208  }
209 
210  /* pass 2: we can do it just after */
211  av_dlog(avctx, "***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
212  block = block1;
213  mb = mb1;
214  init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
215  put_bits32(&pb, 0); // padding must be zeroed
216  flush_put_bits(&pb);
217  for (j = 0; j < s->sys->bpm; j++, block += 64, mb++) {
218  if (mb->pos < 64 && get_bits_left(&gb) > 0) {
219  dv_decode_ac(&gb, mb, block);
220  /* if still not finished, no need to parse other blocks */
221  if (mb->pos < 64)
222  break;
223  }
224  }
225  /* all blocks are finished, so the extra bytes can be used at
226  the video segment level */
227  if (j >= s->sys->bpm)
228  bit_copy(&vs_pb, &gb);
229  }
230 
231  /* we need a pass over the whole video segment */
232  av_dlog(avctx, "***pass 3 size=%d\n", put_bits_count(&vs_pb));
233  block = &sblock[0][0];
234  mb = mb_data;
235  init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
236  put_bits32(&vs_pb, 0); // padding must be zeroed
237  flush_put_bits(&vs_pb);
238  for (mb_index = 0; mb_index < 5; mb_index++) {
239  for (j = 0; j < s->sys->bpm; j++) {
240  if (mb->pos < 64) {
241  av_dlog(avctx, "start %d:%d\n", mb_index, j);
242  dv_decode_ac(&gb, mb, block);
243  }
244  if (mb->pos >= 64 && mb->pos < 127)
245  av_log(avctx, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos);
246  block += 64;
247  mb++;
248  }
249  }
250 
251  /* compute idct and place blocks */
252  block = &sblock[0][0];
253  mb = mb_data;
254  for (mb_index = 0; mb_index < 5; mb_index++) {
255  dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
256 
257  /* idct_put'ting luminance */
258  if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
259  (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
260  (s->sys->height >= 720 && mb_y != 134)) {
261  y_stride = (s->picture.linesize[0] << ((!is_field_mode[mb_index]) * log2_blocksize));
262  } else {
263  y_stride = (2 << log2_blocksize);
264  }
265  y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << log2_blocksize);
266  linesize = s->picture.linesize[0] << is_field_mode[mb_index];
267  mb[0] .idct_put(y_ptr , linesize, block + 0*64);
268  if (s->sys->video_stype == 4) { /* SD 422 */
269  mb[2].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 2*64);
270  } else {
271  mb[1].idct_put(y_ptr + (1 << log2_blocksize) , linesize, block + 1*64);
272  mb[2].idct_put(y_ptr + y_stride, linesize, block + 2*64);
273  mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3*64);
274  }
275  mb += 4;
276  block += 4*64;
277 
278  /* idct_put'ting chrominance */
279  c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->picture.linesize[1] +
280  (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << log2_blocksize);
281  for (j = 2; j; j--) {
282  uint8_t *c_ptr = s->picture.data[j] + c_offset;
283  if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
284  uint64_t aligned_pixels[64/8];
285  uint8_t *pixels = (uint8_t*)aligned_pixels;
286  uint8_t *c_ptr1, *ptr1;
287  int x, y;
288  mb->idct_put(pixels, 8, block);
289  for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->picture.linesize[j], pixels += 8) {
290  ptr1 = pixels + ((1 << (log2_blocksize))>>1);
291  c_ptr1 = c_ptr + (s->picture.linesize[j] << log2_blocksize);
292  for (x = 0; x < (1 << FFMAX(log2_blocksize - 1, 0)); x++) {
293  c_ptr[x] = pixels[x];
294  c_ptr1[x] = ptr1[x];
295  }
296  }
297  block += 64; mb++;
298  } else {
299  y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
300  s->picture.linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
301  linesize = s->picture.linesize[j] << is_field_mode[mb_index];
302  (mb++)-> idct_put(c_ptr , linesize, block); block += 64;
303  if (s->sys->bpm == 8) {
304  (mb++)->idct_put(c_ptr + y_stride, linesize, block); block += 64;
305  }
306  }
307  }
308  }
309  return 0;
310 }
311 
312 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
313  144000 bytes for PAL - or twice those for 50Mbps) */
315  void *data, int *got_frame,
316  AVPacket *avpkt)
317 {
318  uint8_t *buf = avpkt->data;
319  int buf_size = avpkt->size;
320  DVVideoContext *s = avctx->priv_data;
321  const uint8_t* vsc_pack;
322  int ret, apt, is16_9;
323 
324  s->sys = avpriv_dv_frame_profile2(avctx, s->sys, buf, buf_size);
325  if (!s->sys || buf_size < s->sys->frame_size || ff_dv_init_dynamic_tables(s->sys)) {
326  av_log(avctx, AV_LOG_ERROR, "could not find dv frame profile\n");
327  return -1; /* NOTE: we only accept several full frames */
328  }
329 
330  s->picture.key_frame = 1;
332  avctx->pix_fmt = s->sys->pix_fmt;
333  avctx->time_base = s->sys->time_base;
334  avcodec_set_dimensions(avctx, s->sys->width, s->sys->height);
335  if ((ret = ff_get_buffer(avctx, &s->picture, 0)) < 0)
336  return ret;
337  s->picture.interlaced_frame = 1;
338  s->picture.top_field_first = 0;
339 
340  /* Determine the codec's sample_aspect ratio and field order from the packet */
341  vsc_pack = buf + 80*5 + 48 + 5;
342  if ( *vsc_pack == dv_video_control ) {
343  apt = buf[4] & 0x07;
344  is16_9 = (vsc_pack[2] & 0x07) == 0x02 || (!apt && (vsc_pack[2] & 0x07) == 0x07);
345  avctx->sample_aspect_ratio = s->sys->sar[is16_9];
346  s->picture.top_field_first = !(vsc_pack[3] & 0x40);
347  }
348 
349  s->buf = buf;
350  avctx->execute(avctx, dv_decode_video_segment, s->sys->work_chunks, NULL,
351  dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
352 
353  emms_c();
354 
355  /* return image */
356  *got_frame = 1;
357  av_frame_move_ref(data, &s->picture);
358 
359  return s->sys->frame_size;
360 }
361 
363 {
364  DVVideoContext *s = c->priv_data;
365 
366  av_frame_unref(&s->picture);
367 
368  return 0;
369 }
370 
372  .name = "dvvideo",
373  .type = AVMEDIA_TYPE_VIDEO,
374  .id = AV_CODEC_ID_DVVIDEO,
375  .priv_data_size = sizeof(DVVideoContext),
377  .close = dvvideo_close,
379  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS,
380  .max_lowres = 3,
381  .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
382 };
const DVprofile * avpriv_dv_frame_profile2(AVCodecContext *codec, const DVprofile *sys, const uint8_t *frame, unsigned buf_size)
Definition: dv_profile.c:284
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
Definition: put_bits.h:182
const char * s
Definition: avisynth_c.h:668
struct BlockInfo BlockInfo
RL_VLC_ELEM ff_dv_rl_vlc[1184]
Definition: libavcodec/dv.c:52
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
int ff_dv_init_dynamic_tables(const DVprofile *d)
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
struct DVVideoContext DVVideoContext
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y)
Definition: dvdata.h:113
static int dvvideo_close(AVCodecContext *c)
Definition: dvdec.c:362
AVRational sar[2]
Definition: dv_profile.h:53
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
uint8_t run
Definition: svq3.c:136
const uint8_t ff_dv_quant_offset[4]
Definition: dvdata.c:56
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:225
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
Definition: dvdec.c:52
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
uint8_t * buf
Definition: dvdata.h:39
AVCodecContext * avctx
Definition: dvdata.h:38
uint8_t
#define mb
void(* idct_put[2])(uint8_t *dest, int line_size, int16_t *block)
Definition: dvdata.h:45
#define emms_c()
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
enum AVPixelFormat pix_fmt
Definition: dv_profile.h:56
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everythnig contained in src to dst and reset src.
Definition: frame.c:352
uint8_t * data
bitstream reader API header.
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:270
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
const uint8_t * block_sizes
Definition: dv_profile.h:58
static int dv_work_pool_size(const DVprofile *d)
Definition: dvdata.h:103
Discrete Time axis x
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:557
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:160
static void bit_copy(PutBitContext *pb, GetBitContext *gb)
Definition: dvdec.c:119
int shift_offset
Definition: dvdec.c:55
int height
Definition: dv_profile.h:51
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define DV_PROFILE_IS_HD(p)
Definition: dvdata.h:82
Spectrum Plot time data
AVCodec ff_dvvideo_decoder
Definition: dvdec.c:371
const char * arg
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
#define CLOSE_READER(name, gb)
Definition: get_bits.h:140
#define FFMAX(a, b)
Definition: common.h:56
external API header
int8_t len
Definition: get_bits.h:71
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:73
const DVprofile * sys
Definition: dvdata.h:36
AVRational time_base
Definition: dv_profile.h:49
common internal API header
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
AVFrame picture
Definition: dvdata.h:37
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
int width
Definition: dv_profile.h:52
ret
Definition: avfilter.c:821
#define NEG_USR32(a, s)
Definition: mathops.h:159
int size_in_bits
Definition: get_bits.h:57
uint32_t partial_bit_buffer
Definition: dvdec.c:54
float u
const uint8_t * scan_table
Definition: dvdec.c:50
FIXME Range Coding of cr are level
Definition: snow.txt:367
int frame_size
Definition: dv_profile.h:46
#define SHOW_UBITS(name, gb, num)
Definition: get_bits.h:187
static int dvvideo_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: dvdec.c:314
NULL
Definition: eval.c:55
dest
Definition: start.py:60
const uint32_t * factor_table
Definition: dvdec.c:49
typedef void(RENAME(mix_any_func_type))
static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
Definition: dvdec.c:132
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
uint8_t pos
Definition: dvdec.c:51
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
FIXME Range Coding of cr are mx and my are Motion Vector top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff)*mv_scale Intra DC Predicton block[y][x] dc[1]
Definition: snow.txt:392
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define OPEN_READER(name, gb)
Definition: get_bits.h:126
void * buf
Definition: avisynth_c.h:594
uint8_t dv_zigzag[2][64]
Definition: dvdata.h:41
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
int index
Definition: gxfenc.c:89
#define TEX_VLC_BITS
Definition: dvdata.h:96
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
av_cold int ff_dvvideo_init(AVCodecContext *avctx)
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:330
uint8_t partial_bit_count
Definition: dvdec.c:53
#define DV_MAX_BPM
maximum number of blocks per macroblock in any DV format
Definition: dvdata.h:94
const uint8_t * quant
#define MIN_CACHE_BITS
Definition: get_bits.h:122
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
uint8_t run
Definition: get_bits.h:72
uint32_t * idct_factor
Definition: dv_profile.h:55
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
#define CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
common internal api header.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
static double c[64]
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:75
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:54
function y
Definition: D.m:1
uint16_t buf_offset
Definition: dv_profile.h:33
float re
Definition: fft-test.c:64
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:275
simple idct header.
Constants for DV codec.
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
int16_t level
Definition: get_bits.h:70
int video_stype
Definition: dv_profile.h:45
#define LOCAL_ALIGNED_16(t, v,...)
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
Definition: dvdec.c:61
DVwork_chunk * work_chunks
Definition: dv_profile.h:54
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
This structure stores compressed data.
static const int dv_iweight_bits
Definition: dvdec.c:58
bitstream writer API