3 * Copyright (c) 2003 Roman Shaposhnik
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "libavutil/attributes.h"
30 #include "libavutil/pixdesc.h"
34 #include "dv_profile_internal.h"
35 #include "dv_tablegen.h"
39 #include "pixblockdsp.h"
42 static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
44 DVVideoContext *s = avctx->priv_data;
47 PixblockDSPContext pdsp;
50 s->sys = av_dv_codec_profile(avctx->width, avctx->height, avctx->pix_fmt);
52 av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
53 "Valid DV profiles are:\n",
54 avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
55 ff_dv_print_profiles(avctx, AV_LOG_ERROR);
56 return AVERROR(EINVAL);
58 ret = ff_dv_init_dynamic_tables(s, s->sys);
60 av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
64 dv_vlc_map_tableinit();
66 ff_fdctdsp_init(&fdsp, avctx);
67 ff_me_cmp_init(&mecc, avctx);
68 ff_pixblockdsp_init(&pdsp, avctx);
69 ff_set_cmp(&mecc, mecc.ildct_cmp, avctx->ildct_cmp);
71 s->get_pixels = pdsp.get_pixels;
72 s->ildct_cmp = mecc.ildct_cmp[5];
74 s->fdct[0] = fdsp.fdct;
75 s->fdct[1] = fdsp.fdct248;
77 return ff_dvvideo_init(avctx);
80 /* bit budget for AC only in 5 MBs */
81 static const int vs_total_ac_bits = (100 * 4 + 68 * 2) * 5;
82 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
85 /* Convert run and level (where level != 0) pair into VLC, returning bit size */
86 static av_always_inline int dv_rl2vlc(int run, int level, int sign,
90 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
91 *vlc = dv_vlc_map[run][level].vlc | sign;
92 size = dv_vlc_map[run][level].size;
94 if (level < DV_VLC_MAP_LEV_SIZE) {
95 *vlc = dv_vlc_map[0][level].vlc | sign;
96 size = dv_vlc_map[0][level].size;
98 *vlc = 0xfe00 | (level << 1) | sign;
102 *vlc |= ((run < 16) ? dv_vlc_map[run - 1][0].vlc :
103 (0x1f80 | (run - 1))) << size;
104 size += (run < 16) ? dv_vlc_map[run - 1][0].size : 13;
111 static av_always_inline int dv_rl2vlc_size(int run, int level)
115 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
116 size = dv_vlc_map[run][level].size;
118 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
120 size += (run < 16) ? dv_vlc_map[run - 1][0].size : 13;
125 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t *vlc)
127 *vlc = dv_vlc_map[run][l].vlc | sign;
128 return dv_vlc_map[run][l].size;
131 static av_always_inline int dv_rl2vlc_size(int run, int l)
133 return dv_vlc_map[run][l].size;
137 typedef struct EncBlockInfo {
147 uint8_t partial_bit_count;
148 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
151 static av_always_inline PutBitContext *dv_encode_ac(EncBlockInfo *bi,
152 PutBitContext *pb_pool,
153 PutBitContext *pb_end)
156 PutBitContext *pb = pb_pool;
157 int size = bi->partial_bit_count;
158 uint32_t vlc = bi->partial_bit_buffer;
160 bi->partial_bit_count =
161 bi->partial_bit_buffer = 0;
163 /* Find suitable storage space */
164 for (; size > (bits_left = put_bits_left(pb)); pb++) {
167 put_bits(pb, bits_left, vlc >> size);
168 vlc = vlc & ((1 << size) - 1);
170 if (pb + 1 >= pb_end) {
171 bi->partial_bit_count = size;
172 bi->partial_bit_buffer = vlc;
178 put_bits(pb, size, vlc);
180 if (bi->cur_ac >= 64)
183 /* Construct the next VLC */
185 bi->cur_ac = bi->next[prev];
186 if (bi->cur_ac < 64) {
187 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac],
188 bi->sign[bi->cur_ac], &vlc);
191 vlc = 6; /* End Of Block stamp */
197 static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data,
200 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
201 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
203 int is = s->ildct_cmp(NULL, data, NULL, linesize << 1, 4) +
204 s->ildct_cmp(NULL, data + linesize, NULL, linesize << 1, 4);
212 static const int dv_weight_bits = 18;
213 static const int dv_weight_88[64] = {
214 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
215 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
216 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
217 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
218 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
219 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
220 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
221 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
223 static const int dv_weight_248[64] = {
224 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
225 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
226 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
227 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
228 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
229 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
230 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
231 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
234 static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data,
235 int linesize, DVVideoContext *s,
239 const uint8_t *zigzag_scan;
240 LOCAL_ALIGNED_16(int16_t, blk, [64]);
242 /* We offer two different methods for class number assignment: the
243 * method suggested in SMPTE 314M Table 22, and an improved
244 * method. The SMPTE method is very conservative; it assigns class
245 * 3 (i.e. severe quantization) to any block where the largest AC
246 * component is greater than 36. Libav's DV encoder tracks AC bit
247 * consumption precisely, so there is no need to bias most blocks
248 * towards strongly lossy compression. Instead, we assign class 2
249 * to most blocks, and use class 3 only when strictly necessary
250 * (for blocks whose largest AC component exceeds 255). */
252 #if 0 /* SMPTE spec method */
253 static const int classes[] = { 12, 24, 36, 0xffff };
254 #else /* improved Libav method */
255 static const int classes[] = { -1, -1, 255, 0xffff };
257 int max = classes[0];
260 assert((((int) blk) & 15) == 0);
266 bi->partial_bit_count = 0;
267 bi->partial_bit_buffer = 0;
270 bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
271 s->get_pixels(blk, data, linesize);
272 s->fdct[bi->dct_mode](blk);
274 /* We rely on the fact that encoding all zeros leads to an immediate
275 * EOB, which is precisely what the spec calls for in the "dummy"
277 memset(blk, 0, 64 * sizeof(*blk));
282 zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
283 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
285 for (area = 0; area < 4; area++) {
286 bi->prev[area] = prev;
287 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
288 for (i = mb_area_start[area]; i < mb_area_start[area + 1]; i++) {
289 int level = blk[zigzag_scan[i]];
291 if (level + 15 > 30U) {
292 bi->sign[i] = (level >> 31) & 1;
293 /* Weight it and and shift down into range, adding for rounding.
294 * The extra division by a factor of 2^4 reverses the 8x
295 * expansion of the DCT AND the 2x doubling of the weights. */
296 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits + 3))) >>
297 (dv_weight_bits + 4);
301 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
308 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++)
317 for (area = 0; area < 4; area++) {
318 bi->prev[area] = prev;
319 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
320 for (; i < mb_area_start[area + 1]; i = bi->next[i]) {
324 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
333 return bi->bit_size[0] + bi->bit_size[1] +
334 bi->bit_size[2] + bi->bit_size[3];
337 static inline void dv_guess_qnos(EncBlockInfo *blks, int *qnos)
340 int i, j, k, a, prev, a2;
350 for (i = 0; i < 5; i++) {
356 for (j = 0; j < 6; j++, b++) {
357 for (a = 0; a < 4; a++) {
358 if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
359 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
362 assert(b->next[prev] >= mb_area_start[a + 1] || b->mb[prev]);
363 for (k = b->next[prev]; k < mb_area_start[a + 1]; k = b->next[k]) {
366 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
369 if (b->next[k] >= mb_area_start[a + 1] && b->next[k] < 64) {
370 for (a2 = a + 1; b->next[k] >= mb_area_start[a2 + 1]; a2++)
373 assert(b->mb[b->next[k]]);
374 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) -
375 dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
376 assert(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2 + 1] != k));
379 b->next[prev] = b->next[k];
382 b->prev[a + 1] = prev;
384 size[i] += b->bit_size[a];
387 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
390 } while (qnos[0] | qnos[1] | qnos[2] | qnos[3] | qnos[4]);
392 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a) {
394 size[0] = 5 * 6 * 4; // EOB
395 for (j = 0; j < 6 * 5; j++, b++) {
397 for (k = b->next[prev]; k < 64; k = b->next[k]) {
398 if (b->mb[k] < a && b->mb[k] > -a) {
399 b->next[prev] = b->next[k];
401 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
409 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
411 DVVideoContext *s = avctx->priv_data;
412 DVwork_chunk *work_chunk = arg;
414 int mb_x, mb_y, c_offset, linesize, y_stride;
417 LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
418 EncBlockInfo enc_blks[5 * DV_MAX_BPM];
419 PutBitContext pbs[5 * DV_MAX_BPM];
421 EncBlockInfo *enc_blk;
423 int qnos[5] = { 15, 15, 15, 15, 15 }; /* No quantization */
424 int *qnosp = &qnos[0];
426 dif = &s->buf[work_chunk->buf_offset * 80];
427 enc_blk = &enc_blks[0];
428 for (mb_index = 0; mb_index < 5; mb_index++) {
429 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
431 /* initializing luminance blocks */
432 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
433 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
434 (s->sys->height >= 720 && mb_y != 134)) {
435 y_stride = s->frame->linesize[0] << 3;
439 y_ptr = s->frame->data[0] +
440 ((mb_y * s->frame->linesize[0] + mb_x) << 3);
441 linesize = s->frame->linesize[0];
443 if (s->sys->video_stype == 4) { /* SD 422 */
445 dv_init_enc_block(enc_blk + 0, y_ptr, linesize, s, 0) +
446 dv_init_enc_block(enc_blk + 1, NULL, linesize, s, 0) +
447 dv_init_enc_block(enc_blk + 2, y_ptr + 8, linesize, s, 0) +
448 dv_init_enc_block(enc_blk + 3, NULL, linesize, s, 0);
451 dv_init_enc_block(enc_blk + 0, y_ptr, linesize, s, 0) +
452 dv_init_enc_block(enc_blk + 1, y_ptr + 8, linesize, s, 0) +
453 dv_init_enc_block(enc_blk + 2, y_ptr + y_stride, linesize, s, 0) +
454 dv_init_enc_block(enc_blk + 3, y_ptr + 8 + y_stride, linesize, s, 0);
458 /* initializing chrominance blocks */
459 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
460 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
461 for (j = 2; j; j--) {
462 uint8_t *c_ptr = s->frame->data[j] + c_offset;
463 linesize = s->frame->linesize[j];
464 y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
465 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
467 uint8_t *b = scratch;
468 for (i = 0; i < 8; i++) {
469 d = c_ptr + (linesize << 3);
485 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr, linesize, s, 1);
486 if (s->sys->bpm == 8)
487 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride,
492 if (vs_total_ac_bits < vs_bit_size)
493 dv_guess_qnos(&enc_blks[0], qnosp);
495 /* DIF encoding process */
496 for (j = 0; j < 5 * s->sys->bpm;) {
502 /* First pass over individual cells only */
503 for (i = 0; i < s->sys->bpm; i++, j++) {
504 int sz = s->sys->block_sizes[i] >> 3;
506 init_put_bits(&pbs[j], dif, sz);
507 put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
508 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
509 put_bits(&pbs[j], 2, enc_blks[j].cno);
511 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j + 1]);
515 /* Second pass over each MB space */
517 for (i = 0; i < s->sys->bpm; i++)
518 if (enc_blks[start_mb + i].partial_bit_count)
519 pb = dv_encode_ac(&enc_blks[start_mb + i], pb,
520 &pbs[start_mb + s->sys->bpm]);
523 /* Third and final pass over the whole video segment space */
525 for (j = 0; j < 5 * s->sys->bpm; j++) {
526 if (enc_blks[j].partial_bit_count)
527 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm * 5]);
528 if (enc_blks[j].partial_bit_count)
529 av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
532 for (j = 0; j < 5 * s->sys->bpm; j++) {
534 int size = pbs[j].size_in_bits >> 3;
535 flush_put_bits(&pbs[j]);
536 pos = put_bits_count(&pbs[j]) >> 3;
538 av_log(avctx, AV_LOG_ERROR,
539 "bitstream written beyond buffer size\n");
542 memset(pbs[j].buf + pos, 0xff, size - pos);
548 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
552 * Here's what SMPTE314M says about these two:
553 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
554 * as track application IDs (APTn = 001, AP1n =
555 * 001, AP2n = 001, AP3n = 001), if the source signal
556 * comes from a digital VCR. If the signal source is
557 * unknown, all bits for these data shall be set to 1.
558 * (page 12) STYPE: STYPE defines a signal type of video signal
559 * 00000b = 4:1:1 compression
560 * 00100b = 4:2:2 compression
562 * Now, I've got two problems with these statements:
563 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
564 * It seems that for PAL as defined in IEC 61834 we have to set
565 * APT to 000 and for SMPTE314M to 001.
566 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
567 * compression scheme (if any).
569 int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
572 if ((int) (av_q2d(c->avctx->sample_aspect_ratio) *
573 c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
576 buf[0] = (uint8_t) pack_id;
578 case dv_header525: /* I can't imagine why these two weren't defined as real */
579 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
580 buf[1] = 0xf8 | /* reserved -- always 1 */
581 (apt & 0x07); /* APT: Track application ID */
582 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
583 (0x0f << 3) | /* reserved -- always 1 */
584 (apt & 0x07); /* AP1: Audio application ID */
585 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
586 (0x0f << 3) | /* reserved -- always 1 */
587 (apt & 0x07); /* AP2: Video application ID */
588 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
589 (0x0f << 3) | /* reserved -- always 1 */
590 (apt & 0x07); /* AP3: Subcode application ID */
592 case dv_video_source:
593 buf[1] = 0xff; /* reserved -- always 1 */
594 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
595 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
596 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
597 0xf; /* reserved -- always 1 */
598 buf[3] = (3 << 6) | /* reserved -- always 1 */
599 (c->sys->dsf << 5) | /* system: 60fields/50fields */
600 c->sys->video_stype; /* signal type video compression */
601 buf[4] = 0xff; /* VISC: 0xff -- no information */
603 case dv_video_control:
604 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
605 0x3f; /* reserved -- always 1 */
606 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
608 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
609 (1 << 6) | /* first/second field flag 0 -- field 2, 1 -- field 1 */
610 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
611 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
612 0xc; /* reserved -- always b1100 */
613 buf[4] = 0xff; /* reserved -- always 1 */
624 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
625 uint8_t seq_num, uint8_t dif_num,
628 buf[0] = (uint8_t) t; /* Section type */
629 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
630 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
631 7; /* reserved -- always 1 */
632 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
636 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t *buf)
638 if (syb_num == 0 || syb_num == 6) {
639 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
640 (0 << 4) | /* AP3 (Subcode application ID) */
641 0x0f; /* reserved -- always 1 */
642 } else if (syb_num == 11) {
643 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
644 0x7f; /* reserved -- always 1 */
646 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
647 (0 << 4) | /* APT (Track application ID) */
648 0x0f; /* reserved -- always 1 */
650 buf[1] = 0xf0 | /* reserved -- always 1 */
651 (syb_num & 0x0f); /* SSYB number 0 - 11 */
652 buf[2] = 0xff; /* reserved -- always 1 */
656 static void dv_format_frame(DVVideoContext *c, uint8_t *buf)
660 for (chan = 0; chan < c->sys->n_difchan; chan++) {
661 for (i = 0; i < c->sys->difseg_size; i++) {
662 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
664 /* DV header: 1DIF */
665 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
666 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525),
668 buf += 72; /* unused bytes */
670 /* DV subcode: 2DIFs */
671 for (j = 0; j < 2; j++) {
672 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
673 for (k = 0; k < 6; k++)
674 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size / 2), buf) + 5;
675 buf += 29; /* unused bytes */
679 for (j = 0; j < 3; j++) {
680 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
681 buf += dv_write_pack(dv_video_source, c, buf);
682 buf += dv_write_pack(dv_video_control, c, buf);
684 buf += dv_write_pack(dv_video_source, c, buf);
685 buf += dv_write_pack(dv_video_control, c, buf);
686 buf += 4 * 5 + 2; /* unused bytes */
689 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
690 for (j = 0; j < 135; j++) {
692 memset(buf, 0xff, 80);
693 buf += dv_write_dif_id(dv_sect_audio, chan, i, j / 15, buf);
694 buf += 77; /* audio control & shuffled PCM audio */
696 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
697 buf += 77; /* 1 video macroblock: 1 bytes control
698 * 4 * 14 bytes Y 8x8 data
699 * 10 bytes Cr 8x8 data
700 * 10 bytes Cb 8x8 data */
706 static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
707 const AVFrame *frame, int *got_packet)
709 DVVideoContext *s = c->priv_data;
712 if ((ret = ff_alloc_packet(pkt, s->sys->frame_size)) < 0) {
713 av_log(c, AV_LOG_ERROR, "Error getting output packet.\n");
717 c->pix_fmt = s->sys->pix_fmt;
719 #if FF_API_CODED_FRAME
720 FF_DISABLE_DEPRECATION_WARNINGS
721 c->coded_frame->key_frame = 1;
722 c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
723 FF_ENABLE_DEPRECATION_WARNINGS
727 c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
728 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
732 dv_format_frame(s, pkt->data);
734 pkt->flags |= AV_PKT_FLAG_KEY;
740 AVCodec ff_dvvideo_encoder = {
742 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
743 .type = AVMEDIA_TYPE_VIDEO,
744 .id = AV_CODEC_ID_DVVIDEO,
745 .priv_data_size = sizeof(DVVideoContext),
746 .init = dvvideo_encode_init,
747 .encode2 = dvvideo_encode_frame,
748 .capabilities = CODEC_CAP_SLICE_THREADS,
749 .pix_fmts = (const enum AVPixelFormat[]) {
750 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P,
751 AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE