Merge branch 'master' of http://repo.or.cz/r/FFMpeg-mirror
[FFMpeg-mirror/DVCPRO-HD.git] / libavcodec / dv.c
blob0f2872929cc21d91de9f24ac6a6d5a20b58186aa
1 /*
2 * DV decoder
3 * Copyright (c) 2002 Fabrice Bellard.
4 * Copyright (c) 2004 Roman Shaposhnik.
6 * DV encoder
7 * Copyright (c) 2003 Roman Shaposhnik.
9 * 50 Mbps (DVCPRO50) support
10 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
12 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
13 * of DV technical info.
15 * This file is part of FFmpeg.
17 * FFmpeg is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License as published by the Free Software Foundation; either
20 * version 2.1 of the License, or (at your option) any later version.
22 * FFmpeg is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * Lesser General Public License for more details.
27 * You should have received a copy of the GNU Lesser General Public
28 * License along with FFmpeg; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 /**
33 * @file dv.c
34 * DV codec.
36 #define ALT_BITSTREAM_READER
37 #include "avcodec.h"
38 #include "dsputil.h"
39 #include "bitstream.h"
40 #include "simple_idct.h"
41 #include "dvdata.h"
43 //#undef NDEBUG
44 //#include <assert.h>
46 typedef struct DVVideoContext {
47 const DVprofile* sys;
48 AVFrame picture;
49 AVCodecContext *avctx;
50 uint8_t *buf;
52 uint8_t dv_zigzag[2][64];
53 uint8_t dv_idct_shift[2][2][22][64];
55 void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size);
56 void (*fdct[2])(DCTELEM *block);
57 void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
58 } DVVideoContext;
60 /* MultiThreading - dv_anchor applies to entire DV codec, not just the avcontext */
61 /* one element is needed for each video segment in a DV frame */
62 /* at most there are 2 DIF channels * 12 DIF sequences * 27 video segments (PAL 50Mbps) */
63 #define DV_ANCHOR_SIZE (2*12*27)
65 static void* dv_anchor[DV_ANCHOR_SIZE];
67 #define TEX_VLC_BITS 9
69 #ifdef DV_CODEC_TINY_TARGET
70 #define DV_VLC_MAP_RUN_SIZE 15
71 #define DV_VLC_MAP_LEV_SIZE 23
72 #else
73 #define DV_VLC_MAP_RUN_SIZE 64
74 #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
75 #endif
77 /* XXX: also include quantization */
78 static RL_VLC_ELEM dv_rl_vlc[1184];
79 /* VLC encoding lookup table */
80 static struct dv_vlc_pair {
81 uint32_t vlc;
82 uint8_t size;
83 } dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE];
85 static void dv_build_unquantize_tables(DVVideoContext *s, uint8_t* perm)
87 int i, q, j;
89 /* NOTE: max left shift is 6 */
90 for(q = 0; q < 22; q++) {
91 /* 88DCT */
92 for(i = 1; i < 64; i++) {
93 /* 88 table */
94 j = perm[i];
95 s->dv_idct_shift[0][0][q][j] =
96 dv_quant_shifts[q][dv_88_areas[i]] + 1;
97 s->dv_idct_shift[1][0][q][j] = s->dv_idct_shift[0][0][q][j] + 1;
100 /* 248DCT */
101 for(i = 1; i < 64; i++) {
102 /* 248 table */
103 s->dv_idct_shift[0][1][q][i] =
104 dv_quant_shifts[q][dv_248_areas[i]] + 1;
105 s->dv_idct_shift[1][1][q][i] = s->dv_idct_shift[0][1][q][i] + 1;
110 static av_cold int dvvideo_init(AVCodecContext *avctx)
112 DVVideoContext *s = avctx->priv_data;
113 DSPContext dsp;
114 static int done=0;
115 int i, j;
117 if (!done) {
118 VLC dv_vlc;
119 uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
120 uint8_t new_dv_vlc_len[NB_DV_VLC*2];
121 uint8_t new_dv_vlc_run[NB_DV_VLC*2];
122 int16_t new_dv_vlc_level[NB_DV_VLC*2];
124 done = 1;
126 /* dv_anchor lets each thread know its Id */
127 for (i=0; i<DV_ANCHOR_SIZE; i++)
128 dv_anchor[i] = (void*)(size_t)i;
130 /* it's faster to include sign bit in a generic VLC parsing scheme */
131 for (i=0, j=0; i<NB_DV_VLC; i++, j++) {
132 new_dv_vlc_bits[j] = dv_vlc_bits[i];
133 new_dv_vlc_len[j] = dv_vlc_len[i];
134 new_dv_vlc_run[j] = dv_vlc_run[i];
135 new_dv_vlc_level[j] = dv_vlc_level[i];
137 if (dv_vlc_level[i]) {
138 new_dv_vlc_bits[j] <<= 1;
139 new_dv_vlc_len[j]++;
141 j++;
142 new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
143 new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
144 new_dv_vlc_run[j] = dv_vlc_run[i];
145 new_dv_vlc_level[j] = -dv_vlc_level[i];
149 /* NOTE: as a trick, we use the fact the no codes are unused
150 to accelerate the parsing of partial codes */
151 init_vlc(&dv_vlc, TEX_VLC_BITS, j,
152 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
153 assert(dv_vlc.table_size == 1184);
155 for(i = 0; i < dv_vlc.table_size; i++){
156 int code= dv_vlc.table[i][0];
157 int len = dv_vlc.table[i][1];
158 int level, run;
160 if(len<0){ //more bits needed
161 run= 0;
162 level= code;
163 } else {
164 run= new_dv_vlc_run[code] + 1;
165 level= new_dv_vlc_level[code];
167 dv_rl_vlc[i].len = len;
168 dv_rl_vlc[i].level = level;
169 dv_rl_vlc[i].run = run;
171 free_vlc(&dv_vlc);
173 for (i = 0; i < NB_DV_VLC - 1; i++) {
174 if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE)
175 continue;
176 #ifdef DV_CODEC_TINY_TARGET
177 if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE)
178 continue;
179 #endif
181 if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0)
182 continue;
184 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = dv_vlc_bits[i] <<
185 (!!dv_vlc_level[i]);
186 dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = dv_vlc_len[i] +
187 (!!dv_vlc_level[i]);
189 for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) {
190 #ifdef DV_CODEC_TINY_TARGET
191 for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) {
192 if (dv_vlc_map[i][j].size == 0) {
193 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
194 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
195 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
196 dv_vlc_map[0][j].size;
199 #else
200 for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) {
201 if (dv_vlc_map[i][j].size == 0) {
202 dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
203 (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
204 dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size +
205 dv_vlc_map[0][j].size;
207 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc =
208 dv_vlc_map[i][j].vlc | 1;
209 dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size =
210 dv_vlc_map[i][j].size;
212 #endif
216 /* Generic DSP setup */
217 dsputil_init(&dsp, avctx);
218 s->get_pixels = dsp.get_pixels;
220 /* 88DCT setup */
221 s->fdct[0] = dsp.fdct;
222 s->idct_put[0] = dsp.idct_put;
223 for (i=0; i<64; i++)
224 s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
226 /* 248DCT setup */
227 s->fdct[1] = dsp.fdct248;
228 s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP
229 if(avctx->lowres){
230 for (i=0; i<64; i++){
231 int j= ff_zigzag248_direct[i];
232 s->dv_zigzag[1][i] = dsp.idct_permutation[(j&7) + (j&8)*4 + (j&48)/2];
234 }else
235 memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
237 /* XXX: do it only for constant case */
238 dv_build_unquantize_tables(s, dsp.idct_permutation);
240 avctx->coded_frame = &s->picture;
241 s->avctx= avctx;
243 return 0;
246 // #define VLC_DEBUG
247 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
249 typedef struct BlockInfo {
250 const uint8_t *shift_table;
251 const uint8_t *scan_table;
252 const int *iweight_table;
253 uint8_t pos; /* position in block */
254 uint8_t dct_mode;
255 uint8_t partial_bit_count;
256 uint16_t partial_bit_buffer;
257 int shift_offset;
258 } BlockInfo;
260 /* block size in bits */
261 static const uint16_t block_sizes[6] = {
262 112, 112, 112, 112, 80, 80
264 /* bit budget for AC only in 5 MBs */
265 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
266 /* see dv_88_areas and dv_248_areas for details */
267 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
269 static inline int get_bits_left(GetBitContext *s)
271 return s->size_in_bits - get_bits_count(s);
274 static inline int put_bits_left(PutBitContext* s)
276 return (s->buf_end - s->buf) * 8 - put_bits_count(s);
279 /* decode ac coefs */
280 static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
282 int last_index = gb->size_in_bits;
283 const uint8_t *scan_table = mb->scan_table;
284 const uint8_t *shift_table = mb->shift_table;
285 const int *iweight_table = mb->iweight_table;
286 int pos = mb->pos;
287 int partial_bit_count = mb->partial_bit_count;
288 int level, pos1, run, vlc_len, index;
290 OPEN_READER(re, gb);
291 UPDATE_CACHE(re, gb);
293 /* if we must parse a partial vlc, we do it here */
294 if (partial_bit_count > 0) {
295 re_cache = ((unsigned)re_cache >> partial_bit_count) |
296 (mb->partial_bit_buffer << (sizeof(re_cache)*8 - partial_bit_count));
297 re_index -= partial_bit_count;
298 mb->partial_bit_count = 0;
301 /* get the AC coefficients until last_index is reached */
302 for(;;) {
303 #ifdef VLC_DEBUG
304 printf("%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16), re_index);
305 #endif
306 /* our own optimized GET_RL_VLC */
307 index = NEG_USR32(re_cache, TEX_VLC_BITS);
308 vlc_len = dv_rl_vlc[index].len;
309 if (vlc_len < 0) {
310 index = NEG_USR32((unsigned)re_cache << TEX_VLC_BITS, -vlc_len) + dv_rl_vlc[index].level;
311 vlc_len = TEX_VLC_BITS - vlc_len;
313 level = dv_rl_vlc[index].level;
314 run = dv_rl_vlc[index].run;
316 /* gotta check if we're still within gb boundaries */
317 if (re_index + vlc_len > last_index) {
318 /* should be < 16 bits otherwise a codeword could have been parsed */
319 mb->partial_bit_count = last_index - re_index;
320 mb->partial_bit_buffer = NEG_USR32(re_cache, mb->partial_bit_count);
321 re_index = last_index;
322 break;
324 re_index += vlc_len;
326 #ifdef VLC_DEBUG
327 printf("run=%d level=%d\n", run, level);
328 #endif
329 pos += run;
330 if (pos >= 64)
331 break;
333 pos1 = scan_table[pos];
334 level <<= shift_table[pos1];
336 /* unweigh, round, and shift down */
337 level = (level*iweight_table[pos] + (1 << (dv_iweight_bits-1))) >> dv_iweight_bits;
339 block[pos1] = level;
341 UPDATE_CACHE(re, gb);
343 CLOSE_READER(re, gb);
344 mb->pos = pos;
347 static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
349 int bits_left = get_bits_left(gb);
350 while (bits_left >= MIN_CACHE_BITS) {
351 put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
352 bits_left -= MIN_CACHE_BITS;
354 if (bits_left > 0) {
355 put_bits(pb, bits_left, get_bits(gb, bits_left));
359 /* mb_x and mb_y are in units of 8 pixels */
360 static inline void dv_decode_video_segment(DVVideoContext *s,
361 const uint8_t *buf_ptr1,
362 const uint16_t *mb_pos_ptr)
364 int quant, dc, dct_mode, class1, j;
365 int mb_index, mb_x, mb_y, v, last_index;
366 DCTELEM *block, *block1;
367 int c_offset;
368 uint8_t *y_ptr;
369 void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block);
370 const uint8_t *buf_ptr;
371 PutBitContext pb, vs_pb;
372 GetBitContext gb;
373 BlockInfo mb_data[5 * 6], *mb, *mb1;
374 DECLARE_ALIGNED_16(DCTELEM, sblock[5*6][64]);
375 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer[80 + 4]); /* allow some slack */
376 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer[5 * 80 + 4]); /* allow some slack */
377 const int log2_blocksize= 3-s->avctx->lowres;
379 assert((((int)mb_bit_buffer)&7)==0);
380 assert((((int)vs_bit_buffer)&7)==0);
382 memset(sblock, 0, sizeof(sblock));
384 /* pass 1 : read DC and AC coefficients in blocks */
385 buf_ptr = buf_ptr1;
386 block1 = &sblock[0][0];
387 mb1 = mb_data;
388 init_put_bits(&vs_pb, vs_bit_buffer, 5 * 80);
389 for(mb_index = 0; mb_index < 5; mb_index++, mb1 += 6, block1 += 6 * 64) {
390 /* skip header */
391 quant = buf_ptr[3] & 0x0f;
392 buf_ptr += 4;
393 init_put_bits(&pb, mb_bit_buffer, 80);
394 mb = mb1;
395 block = block1;
396 for(j = 0;j < 6; j++) {
397 last_index = block_sizes[j];
398 init_get_bits(&gb, buf_ptr, last_index);
400 /* get the dc */
401 dc = get_sbits(&gb, 9);
402 dct_mode = get_bits1(&gb);
403 mb->dct_mode = dct_mode;
404 mb->scan_table = s->dv_zigzag[dct_mode];
405 mb->iweight_table = dct_mode ? dv_iweight_248 : dv_iweight_88;
406 class1 = get_bits(&gb, 2);
407 mb->shift_table = s->dv_idct_shift[class1 == 3][dct_mode]
408 [quant + dv_quant_offset[class1]];
409 dc = dc << 2;
410 /* convert to unsigned because 128 is not added in the
411 standard IDCT */
412 dc += 1024;
413 block[0] = dc;
414 buf_ptr += last_index >> 3;
415 mb->pos = 0;
416 mb->partial_bit_count = 0;
418 #ifdef VLC_DEBUG
419 printf("MB block: %d, %d ", mb_index, j);
420 #endif
421 dv_decode_ac(&gb, mb, block);
423 /* write the remaining bits in a new buffer only if the
424 block is finished */
425 if (mb->pos >= 64)
426 bit_copy(&pb, &gb);
428 block += 64;
429 mb++;
432 /* pass 2 : we can do it just after */
433 #ifdef VLC_DEBUG
434 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
435 #endif
436 block = block1;
437 mb = mb1;
438 init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
439 flush_put_bits(&pb);
440 for(j = 0;j < 6; j++, block += 64, mb++) {
441 if (mb->pos < 64 && get_bits_left(&gb) > 0) {
442 dv_decode_ac(&gb, mb, block);
443 /* if still not finished, no need to parse other blocks */
444 if (mb->pos < 64)
445 break;
448 /* all blocks are finished, so the extra bytes can be used at
449 the video segment level */
450 if (j >= 6)
451 bit_copy(&vs_pb, &gb);
454 /* we need a pass other the whole video segment */
455 #ifdef VLC_DEBUG
456 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb));
457 #endif
458 block = &sblock[0][0];
459 mb = mb_data;
460 init_get_bits(&gb, vs_bit_buffer, put_bits_count(&vs_pb));
461 flush_put_bits(&vs_pb);
462 for(mb_index = 0; mb_index < 5; mb_index++) {
463 for(j = 0;j < 6; j++) {
464 if (mb->pos < 64) {
465 #ifdef VLC_DEBUG
466 printf("start %d:%d\n", mb_index, j);
467 #endif
468 dv_decode_ac(&gb, mb, block);
470 if (mb->pos >= 64 && mb->pos < 127)
471 av_log(NULL, AV_LOG_ERROR, "AC EOB marker is absent pos=%d\n", mb->pos);
472 block += 64;
473 mb++;
477 /* compute idct and place blocks */
478 block = &sblock[0][0];
479 mb = mb_data;
480 for(mb_index = 0; mb_index < 5; mb_index++) {
481 v = *mb_pos_ptr++;
482 mb_x = v & 0xff;
483 mb_y = v >> 8;
484 if (s->sys->pix_fmt == PIX_FMT_YUV422P) {
485 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + (mb_x>>1))<<log2_blocksize);
486 c_offset = ((mb_y * s->picture.linesize[1] + (mb_x >> 2))<<log2_blocksize);
487 } else { /* 4:1:1 or 4:2:0 */
488 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<log2_blocksize);
489 if (s->sys->pix_fmt == PIX_FMT_YUV411P)
490 c_offset = ((mb_y * s->picture.linesize[1] + (mb_x >> 2))<<log2_blocksize);
491 else /* 4:2:0 */
492 c_offset = (((mb_y >> 1) * s->picture.linesize[1] + (mb_x >> 1))<<log2_blocksize);
494 for(j = 0;j < 6; j++) {
495 idct_put = s->idct_put[mb->dct_mode && log2_blocksize==3];
496 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
497 if (j == 0 || j == 2) {
498 /* Y0 Y1 */
499 idct_put(y_ptr + ((j >> 1)<<log2_blocksize),
500 s->picture.linesize[0], block);
501 } else if(j > 3) {
502 /* Cr Cb */
503 idct_put(s->picture.data[6 - j] + c_offset,
504 s->picture.linesize[6 - j], block);
506 /* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
507 } else { /* 4:1:1 or 4:2:0 */
508 if (j < 4) {
509 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
510 /* NOTE: at end of line, the macroblock is handled as 420 */
511 idct_put(y_ptr + (j<<log2_blocksize), s->picture.linesize[0], block);
512 } else {
513 idct_put(y_ptr + (((j & 1) + (j >> 1) * s->picture.linesize[0])<<log2_blocksize),
514 s->picture.linesize[0], block);
516 } else {
517 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
518 uint64_t aligned_pixels[64/8];
519 uint8_t *pixels= (uint8_t*)aligned_pixels;
520 uint8_t *c_ptr, *c_ptr1, *ptr, *ptr1;
521 int x, y, linesize;
522 /* NOTE: at end of line, the macroblock is handled as 420 */
523 idct_put(pixels, 8, block);
524 linesize = s->picture.linesize[6 - j];
525 c_ptr = s->picture.data[6 - j] + c_offset;
526 ptr = pixels;
527 for(y = 0;y < (1<<log2_blocksize); y++) {
528 ptr1= ptr + (1<<(log2_blocksize-1));
529 c_ptr1 = c_ptr + (linesize<<log2_blocksize);
530 for(x=0; x < (1<<(log2_blocksize-1)); x++){
531 c_ptr[x]= ptr[x]; c_ptr1[x]= ptr1[x];
533 c_ptr += linesize;
534 ptr += 8;
536 } else {
537 /* don't ask me why they inverted Cb and Cr ! */
538 idct_put(s->picture.data[6 - j] + c_offset,
539 s->picture.linesize[6 - j], block);
543 block += 64;
544 mb++;
549 #ifdef DV_CODEC_TINY_TARGET
550 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
551 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
553 int size;
554 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
555 *vlc = dv_vlc_map[run][level].vlc | sign;
556 size = dv_vlc_map[run][level].size;
558 else {
559 if (level < DV_VLC_MAP_LEV_SIZE) {
560 *vlc = dv_vlc_map[0][level].vlc | sign;
561 size = dv_vlc_map[0][level].size;
562 } else {
563 *vlc = 0xfe00 | (level << 1) | sign;
564 size = 16;
566 if (run) {
567 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
568 (0x1f80 | (run - 1))) << size;
569 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
573 return size;
576 static av_always_inline int dv_rl2vlc_size(int run, int level)
578 int size;
580 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
581 size = dv_vlc_map[run][level].size;
583 else {
584 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
585 if (run) {
586 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
589 return size;
591 #else
592 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
594 *vlc = dv_vlc_map[run][l].vlc | sign;
595 return dv_vlc_map[run][l].size;
598 static av_always_inline int dv_rl2vlc_size(int run, int l)
600 return dv_vlc_map[run][l].size;
602 #endif
604 typedef struct EncBlockInfo {
605 int area_q[4];
606 int bit_size[4];
607 int prev[5];
608 int cur_ac;
609 int cno;
610 int dct_mode;
611 DCTELEM mb[64];
612 uint8_t next[64];
613 uint8_t sign[64];
614 uint8_t partial_bit_count;
615 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
616 } EncBlockInfo;
618 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitContext* pb_pool,
619 PutBitContext* pb_end)
621 int prev;
622 int bits_left;
623 PutBitContext* pb = pb_pool;
624 int size = bi->partial_bit_count;
625 uint32_t vlc = bi->partial_bit_buffer;
627 bi->partial_bit_count = bi->partial_bit_buffer = 0;
628 for(;;){
629 /* Find suitable storage space */
630 for (; size > (bits_left = put_bits_left(pb)); pb++) {
631 if (bits_left) {
632 size -= bits_left;
633 put_bits(pb, bits_left, vlc >> size);
634 vlc = vlc & ((1<<size)-1);
636 if (pb + 1 >= pb_end) {
637 bi->partial_bit_count = size;
638 bi->partial_bit_buffer = vlc;
639 return pb;
643 /* Store VLC */
644 put_bits(pb, size, vlc);
646 if(bi->cur_ac>=64)
647 break;
649 /* Construct the next VLC */
650 prev= bi->cur_ac;
651 bi->cur_ac = bi->next[prev];
652 if(bi->cur_ac < 64){
653 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
654 } else {
655 size = 4; vlc = 6; /* End Of Block stamp */
658 return pb;
661 static av_always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi,
662 const uint8_t* zigzag_scan, const int *weight, int bias)
664 int i, area;
665 /* We offer two different methods for class number assignment: the
666 method suggested in SMPTE 314M Table 22, and an improved
667 method. The SMPTE method is very conservative; it assigns class
668 3 (i.e. severe quantization) to any block where the largest AC
669 component is greater than 36. ffmpeg's DV encoder tracks AC bit
670 consumption precisely, so there is no need to bias most blocks
671 towards strongly lossy compression. Instead, we assign class 2
672 to most blocks, and use class 3 only when strictly necessary
673 (for blocks whose largest AC component exceeds 255). */
675 #if 0 /* SMPTE spec method */
676 static const int classes[] = {12, 24, 36, 0xffff};
677 #else /* improved ffmpeg method */
678 static const int classes[] = {-1, -1, 255, 0xffff};
679 #endif
680 int max=classes[0];
681 int prev=0;
683 bi->mb[0] = blk[0];
685 for (area = 0; area < 4; area++) {
686 bi->prev[area] = prev;
687 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
688 for (i=mb_area_start[area]; i<mb_area_start[area+1]; i++) {
689 int level = blk[zigzag_scan[i]];
691 if (level+15 > 30U) {
692 bi->sign[i] = (level>>31)&1;
693 /* weigh it and and shift down into range, adding for rounding */
694 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
695 AND the 2x doubling of the weights */
696 level = (FFABS(level) * weight[i] + (1<<(dv_weight_bits+3))) >> (dv_weight_bits+4);
697 bi->mb[i] = level;
698 if(level>max) max= level;
699 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
700 bi->next[prev]= i;
701 prev= i;
705 bi->next[prev]= i;
706 for(bi->cno = 0; max > classes[bi->cno]; bi->cno++);
708 bi->cno += bias;
710 if (bi->cno >= 3) {
711 bi->cno = 3;
712 prev=0;
713 i= bi->next[prev];
714 for (area = 0; area < 4; area++) {
715 bi->prev[area] = prev;
716 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
717 for (; i<mb_area_start[area+1]; i= bi->next[i]) {
718 bi->mb[i] >>=1;
720 if (bi->mb[i]) {
721 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
722 bi->next[prev]= i;
723 prev= i;
727 bi->next[prev]= i;
731 //FIXME replace this by dsputil
732 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
733 static av_always_inline int dv_guess_dct_mode(DCTELEM *blk) {
734 DCTELEM *s;
735 int score88 = 0;
736 int score248 = 0;
737 int i;
739 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
740 s = blk;
741 for(i=0; i<7; i++) {
742 score88 += SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
743 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
744 s += 8;
746 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
747 s = blk;
748 for(i=0; i<6; i++) {
749 score248 += SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
750 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
751 s += 8;
754 return (score88 - score248 > -10);
757 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
759 int size[5];
760 int i, j, k, a, prev, a2;
761 EncBlockInfo* b;
763 size[0] = size[1] = size[2] = size[3] = size[4] = 1<<24;
764 do {
765 b = blks;
766 for (i=0; i<5; i++) {
767 if (!qnos[i])
768 continue;
770 qnos[i]--;
771 size[i] = 0;
772 for (j=0; j<6; j++, b++) {
773 for (a=0; a<4; a++) {
774 if (b->area_q[a] != dv_quant_shifts[qnos[i] + dv_quant_offset[b->cno]][a]) {
775 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
776 b->area_q[a]++;
777 prev= b->prev[a];
778 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
779 for (k= b->next[prev] ; k<mb_area_start[a+1]; k= b->next[k]) {
780 b->mb[k] >>= 1;
781 if (b->mb[k]) {
782 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
783 prev= k;
784 } else {
785 if(b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
786 for(a2=a+1; b->next[k] >= mb_area_start[a2+1]; a2++)
787 b->prev[a2] = prev;
788 assert(a2<4);
789 assert(b->mb[b->next[k]]);
790 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
791 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
792 assert(b->prev[a2]==k && (a2+1 >= 4 || b->prev[a2+1]!=k));
793 b->prev[a2] = prev;
795 b->next[prev] = b->next[k];
798 b->prev[a+1]= prev;
800 size[i] += b->bit_size[a];
803 if(vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
804 return;
806 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
809 for(a=2; a==2 || vs_total_ac_bits < size[0]; a+=a){
810 b = blks;
811 size[0] = 5*6*4; //EOB
812 for (j=0; j<6*5; j++, b++) {
813 prev= b->prev[0];
814 for (k= b->next[prev]; k<64; k= b->next[k]) {
815 if(b->mb[k] < a && b->mb[k] > -a){
816 b->next[prev] = b->next[k];
817 }else{
818 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
819 prev= k;
826 static inline void dv_encode_video_segment(DVVideoContext *s,
827 uint8_t *dif,
828 const uint16_t *mb_pos_ptr)
830 int mb_index, i, j, v;
831 int mb_x, mb_y, c_offset, linesize;
832 uint8_t* y_ptr;
833 uint8_t* data;
834 uint8_t* ptr;
835 int do_edge_wrap;
836 DECLARE_ALIGNED_16(DCTELEM, block[64]);
837 EncBlockInfo enc_blks[5*6];
838 PutBitContext pbs[5*6];
839 PutBitContext* pb;
840 EncBlockInfo* enc_blk;
841 int vs_bit_size = 0;
842 int qnos[5];
844 assert((((int)block) & 15) == 0);
846 enc_blk = &enc_blks[0];
847 pb = &pbs[0];
848 for(mb_index = 0; mb_index < 5; mb_index++) {
849 v = *mb_pos_ptr++;
850 mb_x = v & 0xff;
851 mb_y = v >> 8;
852 if (s->sys->pix_fmt == PIX_FMT_YUV422P) {
853 y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 4);
854 } else { /* 4:1:1 */
855 y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 8);
857 if (s->sys->pix_fmt == PIX_FMT_YUV420P) {
858 c_offset = (((mb_y >> 1) * s->picture.linesize[1] * 8) + ((mb_x >> 1) * 8));
859 } else { /* 4:2:2 or 4:1:1 */
860 c_offset = ((mb_y * s->picture.linesize[1] * 8) + ((mb_x >> 2) * 8));
862 do_edge_wrap = 0;
863 qnos[mb_index] = 15; /* No quantization */
864 ptr = dif + mb_index*80 + 4;
865 for(j = 0;j < 6; j++) {
866 int dummy = 0;
867 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
868 if (j == 0 || j == 2) {
869 /* Y0 Y1 */
870 data = y_ptr + ((j>>1) * 8);
871 linesize = s->picture.linesize[0];
872 } else if (j > 3) {
873 /* Cr Cb */
874 data = s->picture.data[6 - j] + c_offset;
875 linesize = s->picture.linesize[6 - j];
876 } else {
877 /* j=1 and j=3 are "dummy" blocks, used for AC data only */
878 data = 0;
879 linesize = 0;
880 dummy = 1;
882 } else { /* 4:1:1 or 4:2:0 */
883 if (j < 4) { /* Four Y blocks */
884 /* NOTE: at end of line, the macroblock is handled as 420 */
885 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
886 data = y_ptr + (j * 8);
887 } else {
888 data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
890 linesize = s->picture.linesize[0];
891 } else { /* Cr and Cb blocks */
892 /* don't ask Fabrice why they inverted Cb and Cr ! */
893 data = s->picture.data[6 - j] + c_offset;
894 linesize = s->picture.linesize[6 - j];
895 if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8))
896 do_edge_wrap = 1;
900 /* Everything is set up -- now just copy data -> DCT block */
901 if (do_edge_wrap) { /* Edge wrap copy: 4x16 -> 8x8 */
902 uint8_t* d;
903 DCTELEM *b = block;
904 for (i=0;i<8;i++) {
905 d = data + 8 * linesize;
906 b[0] = data[0]; b[1] = data[1]; b[2] = data[2]; b[3] = data[3];
907 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
908 data += linesize;
909 b += 8;
911 } else { /* Simple copy: 8x8 -> 8x8 */
912 if (!dummy)
913 s->get_pixels(block, data, linesize);
916 if(s->avctx->flags & CODEC_FLAG_INTERLACED_DCT)
917 enc_blk->dct_mode = dv_guess_dct_mode(block);
918 else
919 enc_blk->dct_mode = 0;
920 enc_blk->area_q[0] = enc_blk->area_q[1] = enc_blk->area_q[2] = enc_blk->area_q[3] = 0;
921 enc_blk->partial_bit_count = 0;
922 enc_blk->partial_bit_buffer = 0;
923 enc_blk->cur_ac = 0;
925 if (dummy) {
926 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
927 which is precisely what the spec calls for in the "dummy" blocks. */
928 memset(block, 0, sizeof(block));
929 } else {
930 s->fdct[enc_blk->dct_mode](block);
933 dv_set_class_number(block, enc_blk,
934 enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct,
935 enc_blk->dct_mode ? dv_weight_248 : dv_weight_88,
936 j/4);
938 init_put_bits(pb, ptr, block_sizes[j]/8);
939 put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
940 put_bits(pb, 1, enc_blk->dct_mode);
941 put_bits(pb, 2, enc_blk->cno);
943 vs_bit_size += enc_blk->bit_size[0] + enc_blk->bit_size[1] +
944 enc_blk->bit_size[2] + enc_blk->bit_size[3];
945 ++enc_blk;
946 ++pb;
947 ptr += block_sizes[j]/8;
951 if (vs_total_ac_bits < vs_bit_size)
952 dv_guess_qnos(&enc_blks[0], &qnos[0]);
954 for (i=0; i<5; i++) {
955 dif[i*80 + 3] = qnos[i];
958 /* First pass over individual cells only */
959 for (j=0; j<5*6; j++)
960 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
962 /* Second pass over each MB space */
963 for (j=0; j<5*6; j+=6) {
964 pb= &pbs[j];
965 for (i=0; i<6; i++) {
966 if (enc_blks[i+j].partial_bit_count)
967 pb=dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+6]);
971 /* Third and final pass over the whole vides segment space */
972 pb= &pbs[0];
973 for (j=0; j<5*6; j++) {
974 if (enc_blks[j].partial_bit_count)
975 pb=dv_encode_ac(&enc_blks[j], pb, &pbs[6*5]);
976 if (enc_blks[j].partial_bit_count)
977 av_log(NULL, AV_LOG_ERROR, "ac bitstream overflow\n");
980 for (j=0; j<5*6; j++)
981 flush_put_bits(&pbs[j]);
984 static int dv_decode_mt(AVCodecContext *avctx, void* sl)
986 DVVideoContext *s = avctx->priv_data;
987 int slice = (size_t)sl;
989 /* which DIF channel is this? */
990 int chan = slice / (s->sys->difseg_size * 27);
992 /* slice within the DIF channel */
993 int chan_slice = slice % (s->sys->difseg_size * 27);
995 /* byte offset of this channel's data */
996 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
998 dv_decode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
999 &s->sys->video_place[slice*5]);
1000 return 0;
1003 #ifdef CONFIG_ENCODERS
1004 static int dv_encode_mt(AVCodecContext *avctx, void* sl)
1006 DVVideoContext *s = avctx->priv_data;
1007 int slice = (size_t)sl;
1009 /* which DIF channel is this? */
1010 int chan = slice / (s->sys->difseg_size * 27);
1012 /* slice within the DIF channel */
1013 int chan_slice = slice % (s->sys->difseg_size * 27);
1015 /* byte offset of this channel's data */
1016 int chan_offset = chan * s->sys->difseg_size * 150 * 80;
1018 dv_encode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
1019 &s->sys->video_place[slice*5]);
1020 return 0;
1022 #endif
1024 #ifdef CONFIG_DECODERS
1025 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
1026 144000 bytes for PAL - or twice those for 50Mbps) */
1027 static int dvvideo_decode_frame(AVCodecContext *avctx,
1028 void *data, int *data_size,
1029 const uint8_t *buf, int buf_size)
1031 DVVideoContext *s = avctx->priv_data;
1033 s->sys = dv_frame_profile(buf);
1034 if (!s->sys || buf_size < s->sys->frame_size)
1035 return -1; /* NOTE: we only accept several full frames */
1037 if(s->picture.data[0])
1038 avctx->release_buffer(avctx, &s->picture);
1040 s->picture.reference = 0;
1041 s->picture.key_frame = 1;
1042 s->picture.pict_type = FF_I_TYPE;
1043 avctx->pix_fmt = s->sys->pix_fmt;
1044 avctx->time_base = (AVRational){s->sys->frame_rate_base, s->sys->frame_rate};
1045 avcodec_set_dimensions(avctx, s->sys->width, s->sys->height);
1046 if(avctx->get_buffer(avctx, &s->picture) < 0) {
1047 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1048 return -1;
1050 s->picture.interlaced_frame = 1;
1051 s->picture.top_field_first = 0;
1053 s->buf = buf;
1054 avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
1055 s->sys->n_difchan * s->sys->difseg_size * 27);
1057 emms_c();
1059 /* return image */
1060 *data_size = sizeof(AVFrame);
1061 *(AVFrame*)data= s->picture;
1063 return s->sys->frame_size;
1065 #endif
1068 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, uint8_t* buf)
1071 * Here's what SMPTE314M says about these two:
1072 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
1073 * as track application IDs (APTn = 001, AP1n =
1074 * 001, AP2n = 001, AP3n = 001), if the source signal
1075 * comes from a digital VCR. If the signal source is
1076 * unknown, all bits for these data shall be set to 1.
1077 * (page 12) STYPE: STYPE defines a signal type of video signal
1078 * 00000b = 4:1:1 compression
1079 * 00100b = 4:2:2 compression
1080 * XXXXXX = Reserved
1081 * Now, I've got two problems with these statements:
1082 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
1083 * It seems that for PAL as defined in IEC 61834 we have to set
1084 * APT to 000 and for SMPTE314M to 001.
1085 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
1086 * compression scheme (if any).
1088 int apt = (c->sys->pix_fmt == PIX_FMT_YUV420P ? 0 : 1);
1089 int stype = (c->sys->pix_fmt == PIX_FMT_YUV422P ? 4 : 0);
1091 uint8_t aspect = 0;
1092 if((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) == 17) /* 16:9 */
1093 aspect = 0x02;
1095 buf[0] = (uint8_t)pack_id;
1096 switch (pack_id) {
1097 case dv_header525: /* I can't imagine why these two weren't defined as real */
1098 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
1099 buf[1] = 0xf8 | /* reserved -- always 1 */
1100 (apt & 0x07); /* APT: Track application ID */
1101 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
1102 (0x0f << 3) | /* reserved -- always 1 */
1103 (apt & 0x07); /* AP1: Audio application ID */
1104 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
1105 (0x0f << 3) | /* reserved -- always 1 */
1106 (apt & 0x07); /* AP2: Video application ID */
1107 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
1108 (0x0f << 3) | /* reserved -- always 1 */
1109 (apt & 0x07); /* AP3: Subcode application ID */
1110 break;
1111 case dv_video_source:
1112 buf[1] = 0xff; /* reserved -- always 1 */
1113 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
1114 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
1115 (3 << 4) | /* CLF: color frames id (see ITU-R BT.470-4) */
1116 0xf; /* reserved -- always 1 */
1117 buf[3] = (3 << 6) | /* reserved -- always 1 */
1118 (c->sys->dsf << 5) | /* system: 60fields/50fields */
1119 stype; /* signal type video compression */
1120 buf[4] = 0xff; /* VISC: 0xff -- no information */
1121 break;
1122 case dv_video_control:
1123 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
1124 0x3f; /* reserved -- always 1 */
1125 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
1126 aspect;
1127 buf[3] = (1 << 7) | /* Frame/field flag 1 -- frame, 0 -- field */
1128 (1 << 6) | /* First/second field flag 0 -- field 2, 1 -- field 1 */
1129 (1 << 5) | /* Frame change flag 0 -- same picture as before, 1 -- different */
1130 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
1131 0xc; /* reserved -- always b1100 */
1132 buf[4] = 0xff; /* reserved -- always 1 */
1133 break;
1134 default:
1135 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
1137 return 5;
1140 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
1142 int chan, i, j, k;
1144 for (chan = 0; chan < c->sys->n_difchan; chan++) {
1145 for (i = 0; i < c->sys->difseg_size; i++) {
1146 memset(buf, 0xff, 80 * 6); /* First 6 DIF blocks are for control data */
1148 /* DV header: 1DIF */
1149 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
1150 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
1151 buf += 72; /* unused bytes */
1153 /* DV subcode: 2DIFs */
1154 for (j = 0; j < 2; j++) {
1155 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
1156 for (k = 0; k < 6; k++)
1157 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
1158 buf += 29; /* unused bytes */
1161 /* DV VAUX: 3DIFS */
1162 for (j = 0; j < 3; j++) {
1163 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
1164 buf += dv_write_pack(dv_video_source, c, buf);
1165 buf += dv_write_pack(dv_video_control, c, buf);
1166 buf += 7*5;
1167 buf += dv_write_pack(dv_video_source, c, buf);
1168 buf += dv_write_pack(dv_video_control, c, buf);
1169 buf += 4*5 + 2; /* unused bytes */
1172 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
1173 for (j = 0; j < 135; j++) {
1174 if (j%15 == 0) {
1175 memset(buf, 0xff, 80);
1176 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
1177 buf += 77; /* audio control & shuffled PCM audio */
1179 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
1180 buf += 77; /* 1 video macro block: 1 bytes control
1181 4 * 14 bytes Y 8x8 data
1182 10 bytes Cr 8x8 data
1183 10 bytes Cb 8x8 data */
1190 #ifdef CONFIG_ENCODERS
1191 static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
1192 void *data)
1194 DVVideoContext *s = c->priv_data;
1196 s->sys = dv_codec_profile(c);
1197 if (!s->sys)
1198 return -1;
1199 if(buf_size < s->sys->frame_size)
1200 return -1;
1202 c->pix_fmt = s->sys->pix_fmt;
1203 s->picture = *((AVFrame *)data);
1204 s->picture.key_frame = 1;
1205 s->picture.pict_type = FF_I_TYPE;
1207 s->buf = buf;
1208 c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
1209 s->sys->n_difchan * s->sys->difseg_size * 27);
1211 emms_c();
1213 dv_format_frame(s, buf);
1215 return s->sys->frame_size;
1217 #endif
1219 static int dvvideo_close(AVCodecContext *c)
1221 DVVideoContext *s = c->priv_data;
1223 if(s->picture.data[0])
1224 c->release_buffer(c, &s->picture);
1226 return 0;
1230 #ifdef CONFIG_DVVIDEO_ENCODER
1231 AVCodec dvvideo_encoder = {
1232 "dvvideo",
1233 CODEC_TYPE_VIDEO,
1234 CODEC_ID_DVVIDEO,
1235 sizeof(DVVideoContext),
1236 dvvideo_init,
1237 dvvideo_encode_frame,
1238 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_YUV411P, PIX_FMT_YUV422P, PIX_FMT_YUV420P, PIX_FMT_NONE},
1239 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1241 #endif // CONFIG_DVVIDEO_ENCODER
1243 #ifdef CONFIG_DVVIDEO_DECODER
1244 AVCodec dvvideo_decoder = {
1245 "dvvideo",
1246 CODEC_TYPE_VIDEO,
1247 CODEC_ID_DVVIDEO,
1248 sizeof(DVVideoContext),
1249 dvvideo_init,
1250 NULL,
1251 dvvideo_close,
1252 dvvideo_decode_frame,
1253 CODEC_CAP_DR1,
1254 NULL,
1255 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1257 #endif