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"
36 #include "dv_tablegen.h"
37 #include "dv_profile_internal.h"
39 static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
41 DVVideoContext *s = avctx->priv_data;
46 s->sys = avpriv_dv_codec_profile(avctx);
48 av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
49 "Valid DV profiles are:\n",
50 avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
51 ff_dv_print_profiles(avctx, AV_LOG_ERROR);
52 return AVERROR(EINVAL);
54 if (avctx->height > 576) {
55 av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
56 return AVERROR_PATCHWELCOME;
58 ret = ff_dv_init_dynamic_tables(s, s->sys);
60 av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
64 avctx->coded_frame = av_frame_alloc();
65 if (!avctx->coded_frame)
66 return AVERROR(ENOMEM);
68 dv_vlc_map_tableinit();
70 memset(&dsp,0, sizeof(dsp));
71 ff_dsputil_init(&dsp, avctx);
72 ff_fdctdsp_init(&fdsp, avctx);
73 ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp);
75 s->get_pixels = dsp.get_pixels;
76 s->ildct_cmp = dsp.ildct_cmp[5];
78 s->fdct[0] = fdsp.fdct;
79 s->fdct[1] = fdsp.fdct248;
81 return ff_dvvideo_init(avctx);
84 /* bit budget for AC only in 5 MBs */
85 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
86 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
89 /* Converts run and level (where level != 0) pair into VLC, returning bit size */
90 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
93 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
94 *vlc = dv_vlc_map[run][level].vlc | sign;
95 size = dv_vlc_map[run][level].size;
98 if (level < DV_VLC_MAP_LEV_SIZE) {
99 *vlc = dv_vlc_map[0][level].vlc | sign;
100 size = dv_vlc_map[0][level].size;
102 *vlc = 0xfe00 | (level << 1) | sign;
106 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
107 (0x1f80 | (run - 1))) << size;
108 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
115 static av_always_inline int dv_rl2vlc_size(int run, int level)
119 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
120 size = dv_vlc_map[run][level].size;
123 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
125 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
131 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
133 *vlc = dv_vlc_map[run][l].vlc | sign;
134 return dv_vlc_map[run][l].size;
137 static av_always_inline int dv_rl2vlc_size(int run, int l)
139 return dv_vlc_map[run][l].size;
143 typedef struct EncBlockInfo {
153 uint8_t partial_bit_count;
154 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
157 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi,
158 PutBitContext* pb_pool,
159 PutBitContext* pb_end)
162 PutBitContext* pb = pb_pool;
163 int size = bi->partial_bit_count;
164 uint32_t vlc = bi->partial_bit_buffer;
166 bi->partial_bit_count = bi->partial_bit_buffer = 0;
168 /* Find suitable storage space */
169 for (; size > (bits_left = put_bits_left(pb)); pb++) {
172 put_bits(pb, bits_left, vlc >> size);
173 vlc = vlc & ((1 << size) - 1);
175 if (pb + 1 >= pb_end) {
176 bi->partial_bit_count = size;
177 bi->partial_bit_buffer = vlc;
183 put_bits(pb, size, vlc);
185 if (bi->cur_ac >= 64)
188 /* Construct the next VLC */
190 bi->cur_ac = bi->next[prev];
191 if (bi->cur_ac < 64){
192 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
194 size = 4; vlc = 6; /* End Of Block stamp */
200 static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, int linesize) {
201 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
202 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
204 int is = s->ildct_cmp(NULL, data , NULL, linesize<<1, 4) +
205 s->ildct_cmp(NULL, data + linesize, NULL, linesize<<1, 4);
213 static const int dv_weight_bits = 18;
214 static const int dv_weight_88[64] = {
215 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
216 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
217 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
218 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
219 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
220 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
221 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
222 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
224 static const int dv_weight_248[64] = {
225 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
226 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
227 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
228 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
229 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
230 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
231 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
232 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
235 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
238 const uint8_t* zigzag_scan;
239 LOCAL_ALIGNED_16(int16_t, blk, [64]);
241 /* We offer two different methods for class number assignment: the
242 method suggested in SMPTE 314M Table 22, and an improved
243 method. The SMPTE method is very conservative; it assigns class
244 3 (i.e. severe quantization) to any block where the largest AC
245 component is greater than 36. FFmpeg's DV encoder tracks AC bit
246 consumption precisely, so there is no need to bias most blocks
247 towards strongly lossy compression. Instead, we assign class 2
248 to most blocks, and use class 3 only when strictly necessary
249 (for blocks whose largest AC component exceeds 255). */
251 #if 0 /* SMPTE spec method */
252 static const int classes[] = {12, 24, 36, 0xffff};
253 #else /* improved FFmpeg method */
254 static const int classes[] = {-1, -1, 255, 0xffff};
256 int max = classes[0];
259 av_assert2((((int)blk) & 15) == 0);
261 bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
262 bi->partial_bit_count = 0;
263 bi->partial_bit_buffer = 0;
266 bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
267 s->get_pixels(blk, data, linesize);
268 s->fdct[bi->dct_mode](blk);
270 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
271 which is precisely what the spec calls for in the "dummy" blocks. */
272 memset(blk, 0, 64*sizeof(*blk));
277 zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
278 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
280 for (area = 0; area < 4; area++) {
281 bi->prev[area] = prev;
282 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
283 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
284 int level = blk[zigzag_scan[i]];
286 if (level + 15 > 30U) {
287 bi->sign[i] = (level >> 31) & 1;
288 /* weight it and shift down into range, adding for rounding */
289 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
290 AND the 2x doubling of the weights */
291 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
295 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
302 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
310 for (area = 0; area < 4; area++) {
311 bi->prev[area] = prev;
312 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
313 for (; i < mb_area_start[area+1]; i = bi->next[i]) {
317 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
326 return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
329 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
332 int i, j, k, a, prev, a2;
335 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
338 for (i = 0; i < 5; i++) {
344 for (j = 0; j < 6; j++, b++) {
345 for (a = 0; a < 4; a++) {
346 if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
347 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
350 av_assert2(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
351 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
354 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
357 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
358 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
361 av_assert2(b->mb[b->next[k]]);
362 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
363 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
364 av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
367 b->next[prev] = b->next[k];
372 size[i] += b->bit_size[a];
375 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
378 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
381 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
383 size[0] = 5 * 6 * 4; //EOB
384 for (j = 0; j < 6 *5; j++, b++) {
386 for (k = b->next[prev]; k < 64; k = b->next[k]) {
387 if (b->mb[k] < a && b->mb[k] > -a){
388 b->next[prev] = b->next[k];
390 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
398 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
400 DVVideoContext *s = avctx->priv_data;
401 DVwork_chunk *work_chunk = arg;
403 int mb_x, mb_y, c_offset, linesize, y_stride;
406 LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
407 EncBlockInfo enc_blks[5*DV_MAX_BPM];
408 PutBitContext pbs[5*DV_MAX_BPM];
410 EncBlockInfo* enc_blk;
412 int qnos[5] = {15, 15, 15, 15, 15}; /* No quantization */
413 int* qnosp = &qnos[0];
415 dif = &s->buf[work_chunk->buf_offset*80];
416 enc_blk = &enc_blks[0];
417 for (mb_index = 0; mb_index < 5; mb_index++) {
418 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
420 /* initializing luminance blocks */
421 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
422 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
423 (s->sys->height >= 720 && mb_y != 134)) {
424 y_stride = s->frame->linesize[0] << 3;
428 y_ptr = s->frame->data[0] + ((mb_y * s->frame->linesize[0] + mb_x) << 3);
429 linesize = s->frame->linesize[0];
431 if (s->sys->video_stype == 4) { /* SD 422 */
433 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
434 dv_init_enc_block(enc_blk+1, NULL , linesize, s, 0) +
435 dv_init_enc_block(enc_blk+2, y_ptr + 8 , linesize, s, 0) +
436 dv_init_enc_block(enc_blk+3, NULL , linesize, s, 0);
439 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
440 dv_init_enc_block(enc_blk+1, y_ptr + 8 , linesize, s, 0) +
441 dv_init_enc_block(enc_blk+2, y_ptr + y_stride, linesize, s, 0) +
442 dv_init_enc_block(enc_blk+3, y_ptr + 8 + y_stride, linesize, s, 0);
446 /* initializing chrominance blocks */
447 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
448 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
449 for (j = 2; j; j--) {
450 uint8_t *c_ptr = s->frame->data[j] + c_offset;
451 linesize = s->frame->linesize[j];
452 y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
453 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
455 uint8_t* b = scratch;
456 for (i = 0; i < 8; i++) {
457 d = c_ptr + (linesize << 3);
458 b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; b[3] = c_ptr[3];
459 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
467 vs_bit_size += dv_init_enc_block( enc_blk++, c_ptr , linesize, s, 1);
468 if (s->sys->bpm == 8) {
469 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride, linesize, s, 1);
474 if (vs_total_ac_bits < vs_bit_size)
475 dv_guess_qnos(&enc_blks[0], qnosp);
477 /* DIF encoding process */
478 for (j=0; j<5*s->sys->bpm;) {
484 /* First pass over individual cells only */
485 for (i=0; i<s->sys->bpm; i++, j++) {
486 int sz = s->sys->block_sizes[i]>>3;
488 init_put_bits(&pbs[j], dif, sz);
489 put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
490 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
491 put_bits(&pbs[j], 2, enc_blks[j].cno);
493 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
497 /* Second pass over each MB space */
499 for (i=0; i<s->sys->bpm; i++) {
500 if (enc_blks[start_mb+i].partial_bit_count)
501 pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
505 /* Third and final pass over the whole video segment space */
507 for (j=0; j<5*s->sys->bpm; j++) {
508 if (enc_blks[j].partial_bit_count)
509 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]);
510 if (enc_blks[j].partial_bit_count)
511 av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
514 for (j=0; j<5*s->sys->bpm; j++) {
516 int size = pbs[j].size_in_bits >> 3;
517 flush_put_bits(&pbs[j]);
518 pos = put_bits_count(&pbs[j]) >> 3;
520 av_log(avctx, AV_LOG_ERROR, "bitstream written beyond buffer size\n");
523 memset(pbs[j].buf + pos, 0xff, size - pos);
529 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
533 * Here's what SMPTE314M says about these two:
534 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
535 * as track application IDs (APTn = 001, AP1n =
536 * 001, AP2n = 001, AP3n = 001), if the source signal
537 * comes from a digital VCR. If the signal source is
538 * unknown, all bits for these data shall be set to 1.
539 * (page 12) STYPE: STYPE defines a signal type of video signal
540 * 00000b = 4:1:1 compression
541 * 00100b = 4:2:2 compression
543 * Now, I've got two problems with these statements:
544 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
545 * It seems that for PAL as defined in IEC 61834 we have to set
546 * APT to 000 and for SMPTE314M to 001.
547 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
548 * compression scheme (if any).
550 int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
551 int fs = c->frame->top_field_first ? 0x00 : 0x40;
554 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
557 buf[0] = (uint8_t)pack_id;
559 case dv_header525: /* I can't imagine why these two weren't defined as real */
560 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
561 buf[1] = 0xf8 | /* reserved -- always 1 */
562 (apt & 0x07); /* APT: Track application ID */
563 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
564 (0x0f << 3) | /* reserved -- always 1 */
565 (apt & 0x07); /* AP1: Audio application ID */
566 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
567 (0x0f << 3) | /* reserved -- always 1 */
568 (apt & 0x07); /* AP2: Video application ID */
569 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
570 (0x0f << 3) | /* reserved -- always 1 */
571 (apt & 0x07); /* AP3: Subcode application ID */
573 case dv_video_source:
574 buf[1] = 0xff; /* reserved -- always 1 */
575 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
576 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
577 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
578 0xf; /* reserved -- always 1 */
579 buf[3] = (3 << 6) | /* reserved -- always 1 */
580 (c->sys->dsf << 5) | /* system: 60fields/50fields */
581 c->sys->video_stype; /* signal type video compression */
582 buf[4] = 0xff; /* VISC: 0xff -- no information */
584 case dv_video_control:
585 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
586 0x3f; /* reserved -- always 1 */
587 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
589 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
590 fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */
591 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
592 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
593 0xc; /* reserved -- always b1100 */
594 buf[4] = 0xff; /* reserved -- always 1 */
597 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
602 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
603 uint8_t seq_num, uint8_t dif_num,
606 buf[0] = (uint8_t)t; /* Section type */
607 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
608 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
609 7; /* reserved -- always 1 */
610 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
615 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
617 if (syb_num == 0 || syb_num == 6) {
618 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
619 (0 << 4) | /* AP3 (Subcode application ID) */
620 0x0f; /* reserved -- always 1 */
622 else if (syb_num == 11) {
623 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
624 0x7f; /* reserved -- always 1 */
627 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
628 (0 << 4) | /* APT (Track application ID) */
629 0x0f; /* reserved -- always 1 */
631 buf[1] = 0xf0 | /* reserved -- always 1 */
632 (syb_num & 0x0f); /* SSYB number 0 - 11 */
633 buf[2] = 0xff; /* reserved -- always 1 */
637 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
641 for (chan = 0; chan < c->sys->n_difchan; chan++) {
642 for (i = 0; i < c->sys->difseg_size; i++) {
643 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
645 /* DV header: 1DIF */
646 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
647 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
648 buf += 72; /* unused bytes */
650 /* DV subcode: 2DIFs */
651 for (j = 0; j < 2; j++) {
652 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
653 for (k = 0; k < 6; k++)
654 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
655 buf += 29; /* unused bytes */
659 for (j = 0; j < 3; j++) {
660 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
661 buf += dv_write_pack(dv_video_source, c, buf);
662 buf += dv_write_pack(dv_video_control, c, buf);
664 buf += dv_write_pack(dv_video_source, c, buf);
665 buf += dv_write_pack(dv_video_control, c, buf);
666 buf += 4*5 + 2; /* unused bytes */
669 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
670 for (j = 0; j < 135; j++) {
672 memset(buf, 0xff, 80);
673 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
674 buf += 77; /* audio control & shuffled PCM audio */
676 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
677 buf += 77; /* 1 video macroblock: 1 bytes control
678 4 * 14 bytes Y 8x8 data
680 10 bytes Cb 8x8 data */
687 static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
688 const AVFrame *frame, int *got_packet)
690 DVVideoContext *s = c->priv_data;
693 if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0)
696 c->pix_fmt = s->sys->pix_fmt;
698 c->coded_frame->key_frame = 1;
699 c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
702 c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
703 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
707 dv_format_frame(s, pkt->data);
709 pkt->flags |= AV_PKT_FLAG_KEY;
715 static int dvvideo_encode_close(AVCodecContext *avctx)
717 av_frame_free(&avctx->coded_frame);
721 AVCodec ff_dvvideo_encoder = {
723 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
724 .type = AVMEDIA_TYPE_VIDEO,
725 .id = AV_CODEC_ID_DVVIDEO,
726 .priv_data_size = sizeof(DVVideoContext),
727 .init = dvvideo_encode_init,
728 .encode2 = dvvideo_encode_frame,
729 .close = dvvideo_encode_close,
730 .capabilities = CODEC_CAP_SLICE_THREADS,
731 .pix_fmts = (const enum AVPixelFormat[]) {
732 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE