3 * Copyright (c) 2003 Roman Shaposhnik
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/attributes.h"
28 #include "libavutil/pixdesc.h"
35 #include "dv_tablegen.h"
37 static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
39 DVVideoContext *s = avctx->priv_data;
43 s->sys = avpriv_dv_codec_profile(avctx);
45 av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
46 "Valid DV profiles are:\n",
47 avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
48 ff_dv_print_profiles(avctx, AV_LOG_ERROR);
49 return AVERROR(EINVAL);
51 if (avctx->height > 576) {
52 av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
53 return AVERROR_PATCHWELCOME;
55 ret = ff_dv_init_dynamic_tables(s, s->sys);
57 av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
61 avctx->coded_frame = av_frame_alloc();
62 if (!avctx->coded_frame)
63 return AVERROR(ENOMEM);
65 dv_vlc_map_tableinit();
67 memset(&dsp,0, sizeof(dsp));
68 ff_dsputil_init(&dsp, avctx);
69 ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp);
71 s->get_pixels = dsp.get_pixels;
72 s->ildct_cmp = dsp.ildct_cmp[5];
74 s->fdct[0] = dsp.fdct;
75 s->fdct[1] = dsp.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 /* Converts 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, uint32_t* vlc)
89 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
90 *vlc = dv_vlc_map[run][level].vlc | sign;
91 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;
119 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
121 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
127 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
129 *vlc = dv_vlc_map[run][l].vlc | sign;
130 return dv_vlc_map[run][l].size;
133 static av_always_inline int dv_rl2vlc_size(int run, int l)
135 return dv_vlc_map[run][l].size;
139 typedef struct EncBlockInfo {
149 uint8_t partial_bit_count;
150 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
153 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi,
154 PutBitContext* pb_pool,
155 PutBitContext* pb_end)
158 PutBitContext* pb = pb_pool;
159 int size = bi->partial_bit_count;
160 uint32_t vlc = bi->partial_bit_buffer;
162 bi->partial_bit_count = bi->partial_bit_buffer = 0;
164 /* Find suitable storage space */
165 for (; size > (bits_left = put_bits_left(pb)); pb++) {
168 put_bits(pb, bits_left, vlc >> size);
169 vlc = vlc & ((1 << size) - 1);
171 if (pb + 1 >= pb_end) {
172 bi->partial_bit_count = size;
173 bi->partial_bit_buffer = vlc;
179 put_bits(pb, size, vlc);
181 if (bi->cur_ac >= 64)
184 /* Construct the next VLC */
186 bi->cur_ac = bi->next[prev];
187 if (bi->cur_ac < 64){
188 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
190 size = 4; vlc = 6; /* End Of Block stamp */
196 static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, int linesize) {
197 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
198 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
200 int is = s->ildct_cmp(NULL, data , NULL, linesize<<1, 4) +
201 s->ildct_cmp(NULL, data + linesize, NULL, linesize<<1, 4);
209 static const int dv_weight_bits = 18;
210 static const int dv_weight_88[64] = {
211 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
212 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
213 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
214 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
215 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
216 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
217 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
218 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
220 static const int dv_weight_248[64] = {
221 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
222 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
223 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
224 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
225 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
226 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
227 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
228 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
231 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
234 const uint8_t* zigzag_scan;
235 LOCAL_ALIGNED_16(int16_t, blk, [64]);
237 /* We offer two different methods for class number assignment: the
238 method suggested in SMPTE 314M Table 22, and an improved
239 method. The SMPTE method is very conservative; it assigns class
240 3 (i.e. severe quantization) to any block where the largest AC
241 component is greater than 36. FFmpeg's DV encoder tracks AC bit
242 consumption precisely, so there is no need to bias most blocks
243 towards strongly lossy compression. Instead, we assign class 2
244 to most blocks, and use class 3 only when strictly necessary
245 (for blocks whose largest AC component exceeds 255). */
247 #if 0 /* SMPTE spec method */
248 static const int classes[] = {12, 24, 36, 0xffff};
249 #else /* improved FFmpeg method */
250 static const int classes[] = {-1, -1, 255, 0xffff};
252 int max = classes[0];
255 av_assert2((((int)blk) & 15) == 0);
257 bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
258 bi->partial_bit_count = 0;
259 bi->partial_bit_buffer = 0;
262 bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
263 s->get_pixels(blk, data, linesize);
264 s->fdct[bi->dct_mode](blk);
266 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
267 which is precisely what the spec calls for in the "dummy" blocks. */
268 memset(blk, 0, 64*sizeof(*blk));
273 zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
274 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
276 for (area = 0; area < 4; area++) {
277 bi->prev[area] = prev;
278 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
279 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
280 int level = blk[zigzag_scan[i]];
282 if (level + 15 > 30U) {
283 bi->sign[i] = (level >> 31) & 1;
284 /* weight it and shift down into range, adding for rounding */
285 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
286 AND the 2x doubling of the weights */
287 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
291 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
298 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
306 for (area = 0; area < 4; area++) {
307 bi->prev[area] = prev;
308 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
309 for (; i < mb_area_start[area+1]; i = bi->next[i]) {
313 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
322 return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
325 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
328 int i, j, k, a, prev, a2;
331 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
334 for (i = 0; i < 5; i++) {
340 for (j = 0; j < 6; j++, b++) {
341 for (a = 0; a < 4; a++) {
342 if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
343 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
346 av_assert2(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
347 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
350 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
353 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
354 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
357 av_assert2(b->mb[b->next[k]]);
358 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
359 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
360 av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
363 b->next[prev] = b->next[k];
368 size[i] += b->bit_size[a];
371 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
374 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
377 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
379 size[0] = 5 * 6 * 4; //EOB
380 for (j = 0; j < 6 *5; j++, b++) {
382 for (k = b->next[prev]; k < 64; k = b->next[k]) {
383 if (b->mb[k] < a && b->mb[k] > -a){
384 b->next[prev] = b->next[k];
386 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
394 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
396 DVVideoContext *s = avctx->priv_data;
397 DVwork_chunk *work_chunk = arg;
399 int mb_x, mb_y, c_offset, linesize, y_stride;
402 LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
403 EncBlockInfo enc_blks[5*DV_MAX_BPM];
404 PutBitContext pbs[5*DV_MAX_BPM];
406 EncBlockInfo* enc_blk;
408 int qnos[5] = {15, 15, 15, 15, 15}; /* No quantization */
409 int* qnosp = &qnos[0];
411 dif = &s->buf[work_chunk->buf_offset*80];
412 enc_blk = &enc_blks[0];
413 for (mb_index = 0; mb_index < 5; mb_index++) {
414 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
416 /* initializing luminance blocks */
417 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
418 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
419 (s->sys->height >= 720 && mb_y != 134)) {
420 y_stride = s->frame->linesize[0] << 3;
424 y_ptr = s->frame->data[0] + ((mb_y * s->frame->linesize[0] + mb_x) << 3);
425 linesize = s->frame->linesize[0];
427 if (s->sys->video_stype == 4) { /* SD 422 */
429 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
430 dv_init_enc_block(enc_blk+1, NULL , linesize, s, 0) +
431 dv_init_enc_block(enc_blk+2, y_ptr + 8 , linesize, s, 0) +
432 dv_init_enc_block(enc_blk+3, NULL , linesize, s, 0);
435 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
436 dv_init_enc_block(enc_blk+1, y_ptr + 8 , linesize, s, 0) +
437 dv_init_enc_block(enc_blk+2, y_ptr + y_stride, linesize, s, 0) +
438 dv_init_enc_block(enc_blk+3, y_ptr + 8 + y_stride, linesize, s, 0);
442 /* initializing chrominance blocks */
443 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
444 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
445 for (j = 2; j; j--) {
446 uint8_t *c_ptr = s->frame->data[j] + c_offset;
447 linesize = s->frame->linesize[j];
448 y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
449 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
451 uint8_t* b = scratch;
452 for (i = 0; i < 8; i++) {
453 d = c_ptr + (linesize << 3);
454 b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; b[3] = c_ptr[3];
455 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
463 vs_bit_size += dv_init_enc_block( enc_blk++, c_ptr , linesize, s, 1);
464 if (s->sys->bpm == 8) {
465 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride, linesize, s, 1);
470 if (vs_total_ac_bits < vs_bit_size)
471 dv_guess_qnos(&enc_blks[0], qnosp);
473 /* DIF encoding process */
474 for (j=0; j<5*s->sys->bpm;) {
480 /* First pass over individual cells only */
481 for (i=0; i<s->sys->bpm; i++, j++) {
482 int sz = s->sys->block_sizes[i]>>3;
484 init_put_bits(&pbs[j], dif, sz);
485 put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
486 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
487 put_bits(&pbs[j], 2, enc_blks[j].cno);
489 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
493 /* Second pass over each MB space */
495 for (i=0; i<s->sys->bpm; i++) {
496 if (enc_blks[start_mb+i].partial_bit_count)
497 pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
501 /* Third and final pass over the whole video segment space */
503 for (j=0; j<5*s->sys->bpm; j++) {
504 if (enc_blks[j].partial_bit_count)
505 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]);
506 if (enc_blks[j].partial_bit_count)
507 av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
510 for (j=0; j<5*s->sys->bpm; j++) {
512 int size = pbs[j].size_in_bits >> 3;
513 flush_put_bits(&pbs[j]);
514 pos = put_bits_count(&pbs[j]) >> 3;
516 av_log(avctx, AV_LOG_ERROR, "bitstream written beyond buffer size\n");
519 memset(pbs[j].buf + pos, 0xff, size - pos);
525 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
529 * Here's what SMPTE314M says about these two:
530 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
531 * as track application IDs (APTn = 001, AP1n =
532 * 001, AP2n = 001, AP3n = 001), if the source signal
533 * comes from a digital VCR. If the signal source is
534 * unknown, all bits for these data shall be set to 1.
535 * (page 12) STYPE: STYPE defines a signal type of video signal
536 * 00000b = 4:1:1 compression
537 * 00100b = 4:2:2 compression
539 * Now, I've got two problems with these statements:
540 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
541 * It seems that for PAL as defined in IEC 61834 we have to set
542 * APT to 000 and for SMPTE314M to 001.
543 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
544 * compression scheme (if any).
546 int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
547 int fs = c->frame->top_field_first ? 0x00 : 0x40;
550 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
553 buf[0] = (uint8_t)pack_id;
555 case dv_header525: /* I can't imagine why these two weren't defined as real */
556 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
557 buf[1] = 0xf8 | /* reserved -- always 1 */
558 (apt & 0x07); /* APT: Track application ID */
559 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
560 (0x0f << 3) | /* reserved -- always 1 */
561 (apt & 0x07); /* AP1: Audio application ID */
562 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
563 (0x0f << 3) | /* reserved -- always 1 */
564 (apt & 0x07); /* AP2: Video application ID */
565 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
566 (0x0f << 3) | /* reserved -- always 1 */
567 (apt & 0x07); /* AP3: Subcode application ID */
569 case dv_video_source:
570 buf[1] = 0xff; /* reserved -- always 1 */
571 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
572 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
573 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
574 0xf; /* reserved -- always 1 */
575 buf[3] = (3 << 6) | /* reserved -- always 1 */
576 (c->sys->dsf << 5) | /* system: 60fields/50fields */
577 c->sys->video_stype; /* signal type video compression */
578 buf[4] = 0xff; /* VISC: 0xff -- no information */
580 case dv_video_control:
581 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
582 0x3f; /* reserved -- always 1 */
583 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
585 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
586 fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */
587 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
588 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
589 0xc; /* reserved -- always b1100 */
590 buf[4] = 0xff; /* reserved -- always 1 */
593 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
598 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
599 uint8_t seq_num, uint8_t dif_num,
602 buf[0] = (uint8_t)t; /* Section type */
603 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
604 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
605 7; /* reserved -- always 1 */
606 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
611 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
613 if (syb_num == 0 || syb_num == 6) {
614 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
615 (0 << 4) | /* AP3 (Subcode application ID) */
616 0x0f; /* reserved -- always 1 */
618 else if (syb_num == 11) {
619 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
620 0x7f; /* reserved -- always 1 */
623 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
624 (0 << 4) | /* APT (Track application ID) */
625 0x0f; /* reserved -- always 1 */
627 buf[1] = 0xf0 | /* reserved -- always 1 */
628 (syb_num & 0x0f); /* SSYB number 0 - 11 */
629 buf[2] = 0xff; /* reserved -- always 1 */
633 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
637 for (chan = 0; chan < c->sys->n_difchan; chan++) {
638 for (i = 0; i < c->sys->difseg_size; i++) {
639 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
641 /* DV header: 1DIF */
642 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
643 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
644 buf += 72; /* unused bytes */
646 /* DV subcode: 2DIFs */
647 for (j = 0; j < 2; j++) {
648 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
649 for (k = 0; k < 6; k++)
650 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
651 buf += 29; /* unused bytes */
655 for (j = 0; j < 3; j++) {
656 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
657 buf += dv_write_pack(dv_video_source, c, buf);
658 buf += dv_write_pack(dv_video_control, c, buf);
660 buf += dv_write_pack(dv_video_source, c, buf);
661 buf += dv_write_pack(dv_video_control, c, buf);
662 buf += 4*5 + 2; /* unused bytes */
665 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
666 for (j = 0; j < 135; j++) {
668 memset(buf, 0xff, 80);
669 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
670 buf += 77; /* audio control & shuffled PCM audio */
672 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
673 buf += 77; /* 1 video macroblock: 1 bytes control
674 4 * 14 bytes Y 8x8 data
676 10 bytes Cb 8x8 data */
683 static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
684 const AVFrame *frame, int *got_packet)
686 DVVideoContext *s = c->priv_data;
689 if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0)
692 c->pix_fmt = s->sys->pix_fmt;
694 c->coded_frame->key_frame = 1;
695 c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
698 c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
699 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
703 dv_format_frame(s, pkt->data);
705 pkt->flags |= AV_PKT_FLAG_KEY;
711 static int dvvideo_encode_close(AVCodecContext *avctx)
713 av_frame_free(&avctx->coded_frame);
717 AVCodec ff_dvvideo_encoder = {
719 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
720 .type = AVMEDIA_TYPE_VIDEO,
721 .id = AV_CODEC_ID_DVVIDEO,
722 .priv_data_size = sizeof(DVVideoContext),
723 .init = dvvideo_encode_init,
724 .encode2 = dvvideo_encode_frame,
725 .close = dvvideo_encode_close,
726 .capabilities = CODEC_CAP_SLICE_THREADS,
727 .pix_fmts = (const enum AVPixelFormat[]) {
728 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE