LCOV - code coverage report
Current view: top level - libavcodec - dvenc.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 327 361 90.6 %
Date: 2017-12-15 18:13:28 Functions: 13 13 100.0 %

          Line data    Source code
       1             : /*
       2             :  * DV encoder
       3             :  * Copyright (c) 2003 Roman Shaposhnik
       4             :  *
       5             :  * This file is part of FFmpeg.
       6             :  *
       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.
      11             :  *
      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.
      16             :  *
      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
      20             :  *
      21             :  * quant_deadzone code and fixes sponsored by NOA GmbH
      22             :  */
      23             : 
      24             : /**
      25             :  * @file
      26             :  * DV encoder
      27             :  */
      28             : 
      29             : #include "config.h"
      30             : 
      31             : #include "libavutil/attributes.h"
      32             : #include "libavutil/internal.h"
      33             : #include "libavutil/opt.h"
      34             : #include "libavutil/pixdesc.h"
      35             : 
      36             : #include "avcodec.h"
      37             : #include "dv.h"
      38             : #include "dv_profile_internal.h"
      39             : #include "dv_tablegen.h"
      40             : #include "fdctdsp.h"
      41             : #include "internal.h"
      42             : #include "mathops.h"
      43             : #include "me_cmp.h"
      44             : #include "pixblockdsp.h"
      45             : #include "put_bits.h"
      46             : 
      47          14 : static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
      48             : {
      49          14 :     DVVideoContext *s = avctx->priv_data;
      50             :     FDCTDSPContext fdsp;
      51             :     MECmpContext mecc;
      52             :     PixblockDSPContext pdsp;
      53             :     int ret;
      54             : 
      55          14 :     s->sys = av_dv_codec_profile2(avctx->width, avctx->height, avctx->pix_fmt, avctx->time_base);
      56          14 :     if (!s->sys) {
      57           0 :         av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
      58             :                                     "Valid DV profiles are:\n",
      59             :                avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
      60           0 :         ff_dv_print_profiles(avctx, AV_LOG_ERROR);
      61           0 :         return AVERROR(EINVAL);
      62             :     }
      63          14 :     if (avctx->height > 576) {
      64           0 :         av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
      65           0 :         return AVERROR_PATCHWELCOME;
      66             :     }
      67          14 :     ret = ff_dv_init_dynamic_tables(s, s->sys);
      68          14 :     if (ret < 0) {
      69           0 :         av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
      70           0 :         return ret;
      71             :     }
      72             : 
      73          14 :     dv_vlc_map_tableinit();
      74             : 
      75          14 :     memset(&fdsp,0, sizeof(fdsp));
      76          14 :     memset(&mecc,0, sizeof(mecc));
      77          14 :     memset(&pdsp,0, sizeof(pdsp));
      78          14 :     ff_fdctdsp_init(&fdsp, avctx);
      79          14 :     ff_me_cmp_init(&mecc, avctx);
      80          14 :     ff_pixblockdsp_init(&pdsp, avctx);
      81          14 :     ff_set_cmp(&mecc, mecc.ildct_cmp, avctx->ildct_cmp);
      82             : 
      83          14 :     s->get_pixels = pdsp.get_pixels;
      84          14 :     s->ildct_cmp  = mecc.ildct_cmp[5];
      85             : 
      86          14 :     s->fdct[0]    = fdsp.fdct;
      87          14 :     s->fdct[1]    = fdsp.fdct248;
      88             : 
      89          14 :     return ff_dvvideo_init(avctx);
      90             : }
      91             : 
      92             : /* bit budget for AC only in 5 MBs */
      93             : static const int vs_total_ac_bits = (100 * 4 + 68 * 2) * 5;
      94             : static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
      95             : 
      96             : #if CONFIG_SMALL
      97             : /* Convert run and level (where level != 0) pair into VLC, returning bit size */
      98             : static av_always_inline int dv_rl2vlc(int run, int level, int sign,
      99             :                                       uint32_t *vlc)
     100             : {
     101             :     int size;
     102             :     if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
     103             :         *vlc = dv_vlc_map[run][level].vlc | sign;
     104             :         size = dv_vlc_map[run][level].size;
     105             :     } else {
     106             :         if (level < DV_VLC_MAP_LEV_SIZE) {
     107             :             *vlc = dv_vlc_map[0][level].vlc | sign;
     108             :             size = dv_vlc_map[0][level].size;
     109             :         } else {
     110             :             *vlc = 0xfe00 | (level << 1) | sign;
     111             :             size = 16;
     112             :         }
     113             :         if (run) {
     114             :             *vlc |= ((run < 16) ? dv_vlc_map[run - 1][0].vlc :
     115             :                      (0x1f80 | (run - 1))) << size;
     116             :             size +=  (run < 16) ? dv_vlc_map[run - 1][0].size : 13;
     117             :         }
     118             :     }
     119             : 
     120             :     return size;
     121             : }
     122             : 
     123             : static av_always_inline int dv_rl2vlc_size(int run, int level)
     124             : {
     125             :     int size;
     126             : 
     127             :     if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
     128             :         size = dv_vlc_map[run][level].size;
     129             :     } else {
     130             :         size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
     131             :         if (run)
     132             :             size += (run < 16) ? dv_vlc_map[run - 1][0].size : 13;
     133             :     }
     134             :     return size;
     135             : }
     136             : #else
     137    82380303 : static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t *vlc)
     138             : {
     139    82380303 :     *vlc = dv_vlc_map[run][l].vlc | sign;
     140    82380303 :     return dv_vlc_map[run][l].size;
     141             : }
     142             : 
     143   188866541 : static av_always_inline int dv_rl2vlc_size(int run, int l)
     144             : {
     145   188866541 :     return dv_vlc_map[run][l].size;
     146             : }
     147             : #endif
     148             : 
     149             : typedef struct EncBlockInfo {
     150             :     int      area_q[4];
     151             :     int      bit_size[4];
     152             :     int      prev[5];
     153             :     int      cur_ac;
     154             :     int      cno;
     155             :     int      dct_mode;
     156             :     int16_t  mb[64];
     157             :     uint8_t  next[64];
     158             :     uint8_t  sign[64];
     159             :     uint8_t  partial_bit_count;
     160             :     uint32_t partial_bit_buffer; /* we can't use uint16_t here */
     161             : } EncBlockInfo;
     162             : 
     163    11249874 : static av_always_inline PutBitContext *dv_encode_ac(EncBlockInfo *bi,
     164             :                                                     PutBitContext *pb_pool,
     165             :                                                     PutBitContext *pb_end)
     166             : {
     167             :     int prev, bits_left;
     168    11249874 :     PutBitContext *pb = pb_pool;
     169    11249874 :     int size          = bi->partial_bit_count;
     170    11249874 :     uint32_t vlc      = bi->partial_bit_buffer;
     171             : 
     172    11249874 :     bi->partial_bit_count  =
     173    11249874 :     bi->partial_bit_buffer = 0;
     174             :     for (;;) {
     175             :         /* Find suitable storage space */
     176   197810394 :         for (; size > (bits_left = put_bits_left(pb)); pb++) {
     177    11179788 :             if (bits_left) {
     178     4712023 :                 size -= bits_left;
     179     4712023 :                 put_bits(pb, bits_left, vlc >> size);
     180     4712023 :                 vlc = av_mod_uintp2(vlc, size);
     181             :             }
     182    11179788 :             if (pb + 1 >= pb_end) {
     183     3959874 :                 bi->partial_bit_count  = size;
     184     3959874 :                 bi->partial_bit_buffer = vlc;
     185     3959874 :                 return pb;
     186             :             }
     187             :         }
     188             : 
     189             :         /* Store VLC */
     190    96960303 :         put_bits(pb, size, vlc);
     191             : 
     192    96960303 :         if (bi->cur_ac >= 64)
     193     7290000 :             break;
     194             : 
     195             :         /* Construct the next VLC */
     196    89670303 :         prev       = bi->cur_ac;
     197    89670303 :         bi->cur_ac = bi->next[prev];
     198    89670303 :         if (bi->cur_ac < 64) {
     199    82380303 :             size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac],
     200    82380303 :                              bi->sign[bi->cur_ac], &vlc);
     201             :         } else {
     202     7290000 :             size = 4;
     203     7290000 :             vlc  = 6; /* End Of Block stamp */
     204             :         }
     205             :     }
     206     7290000 :     return pb;
     207             : }
     208             : 
     209     6156000 : static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data,
     210             :                                               ptrdiff_t linesize)
     211             : {
     212     6156000 :     if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
     213           0 :         int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
     214           0 :         if (ps > 0) {
     215           0 :             int is = s->ildct_cmp(NULL, data,            NULL, linesize << 1, 4) +
     216           0 :                      s->ildct_cmp(NULL, data + linesize, NULL, linesize << 1, 4);
     217           0 :             return ps > is;
     218             :         }
     219             :     }
     220             : 
     221     6156000 :     return 0;
     222             : }
     223             : 
     224             : static const int dv_weight_bits = 18;
     225             : static const int dv_weight_88[64] = {
     226             :     131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
     227             :     237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
     228             :     224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
     229             :     212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
     230             :     206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
     231             :     200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
     232             :     174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
     233             :     170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
     234             : };
     235             : static const int dv_weight_248[64] = {
     236             :     131072, 262144, 257107, 257107, 242189, 242189, 242189, 242189,
     237             :     237536, 237536, 229376, 229376, 200636, 200636, 224973, 224973,
     238             :     223754, 223754, 235923, 235923, 229376, 229376, 217965, 217965,
     239             :     211916, 211916, 196781, 196781, 185364, 185364, 206433, 206433,
     240             :     211916, 211916, 222935, 222935, 200636, 200636, 205964, 205964,
     241             :     200704, 200704, 180568, 180568, 175557, 175557, 195068, 195068,
     242             :     185364, 185364, 188995, 188995, 174606, 174606, 175557, 175557,
     243             :     170627, 170627, 153560, 153560, 165371, 165371, 144651, 144651,
     244             : };
     245             : 
     246     7290000 : static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data,
     247             :                                               ptrdiff_t linesize,
     248             :                                               DVVideoContext *s, int bias)
     249             : {
     250             :     const int *weight;
     251             :     const uint8_t *zigzag_scan;
     252     7290000 :     LOCAL_ALIGNED_16(int16_t, blk, [64]);
     253             :     int i, area;
     254             :     /* We offer two different methods for class number assignment: the
     255             :      * method suggested in SMPTE 314M Table 22, and an improved
     256             :      * method. The SMPTE method is very conservative; it assigns class
     257             :      * 3 (i.e. severe quantization) to any block where the largest AC
     258             :      * component is greater than 36. FFmpeg's DV encoder tracks AC bit
     259             :      * consumption precisely, so there is no need to bias most blocks
     260             :      * towards strongly lossy compression. Instead, we assign class 2
     261             :      * to most blocks, and use class 3 only when strictly necessary
     262             :      * (for blocks whose largest AC component exceeds 255). */
     263             : 
     264             : #if 0 /* SMPTE spec method */
     265             :     static const int classes[] = { 12, 24, 36, 0xffff };
     266             : #else /* improved FFmpeg method */
     267             :     static const int classes[] = { -1, -1, 255, 0xffff };
     268             : #endif
     269     7290000 :     int max  = classes[0];
     270     7290000 :     int prev = 0;
     271     7290000 :     const unsigned deadzone = s->quant_deadzone;
     272     7290000 :     const unsigned threshold = 2 * deadzone;
     273             : 
     274             :     av_assert2((((int) blk) & 15) == 0);
     275             : 
     276     7290000 :     bi->area_q[0]          =
     277     7290000 :     bi->area_q[1]          =
     278     7290000 :     bi->area_q[2]          =
     279     7290000 :     bi->area_q[3]          = 0;
     280     7290000 :     bi->partial_bit_count  = 0;
     281     7290000 :     bi->partial_bit_buffer = 0;
     282     7290000 :     bi->cur_ac             = 0;
     283     7290000 :     if (data) {
     284     6156000 :         bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
     285     6156000 :         s->get_pixels(blk, data, linesize);
     286     6156000 :         s->fdct[bi->dct_mode](blk);
     287             :     } else {
     288             :         /* We rely on the fact that encoding all zeros leads to an immediate
     289             :          * EOB, which is precisely what the spec calls for in the "dummy"
     290             :          * blocks. */
     291     1134000 :         memset(blk, 0, 64 * sizeof(*blk));
     292     1134000 :         bi->dct_mode = 0;
     293             :     }
     294     7290000 :     bi->mb[0] = blk[0];
     295             : 
     296     7290000 :     zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
     297     7290000 :     weight      = bi->dct_mode ? dv_weight_248 : dv_weight_88;
     298             : 
     299    36450000 :     for (area = 0; area < 4; area++) {
     300    29160000 :         bi->prev[area]     = prev;
     301    29160000 :         bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
     302   488430000 :         for (i = mb_area_start[area]; i < mb_area_start[area + 1]; i++) {
     303   459270000 :             int level = blk[zigzag_scan[i]];
     304             : 
     305   459270000 :             if (level + deadzone > threshold) {
     306   140566792 :                 bi->sign[i] = (level >> 31) & 1;
     307             :                 /* Weight it and shift down into range, adding for rounding.
     308             :                  * The extra division by a factor of 2^4 reverses the 8x
     309             :                  * expansion of the DCT AND the 2x doubling of the weights. */
     310   281133584 :                 level     = (FFABS(level) * weight[i] + (1 << (dv_weight_bits + 3))) >>
     311   140566792 :                             (dv_weight_bits + 4);
     312   140566792 :                 if (!level)
     313    16556689 :                     continue;
     314   124010103 :                 bi->mb[i] = level;
     315   124010103 :                 if (level > max)
     316    10763673 :                     max = level;
     317   124010103 :                 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
     318   124010103 :                 bi->next[prev]      = i;
     319   124010103 :                 prev                = i;
     320             :             }
     321             :         }
     322             :     }
     323     7290000 :     bi->next[prev] = i;
     324     7290000 :     for (bi->cno = 0; max > classes[bi->cno]; bi->cno++)
     325             :         ;
     326             : 
     327     7290000 :     bi->cno += bias;
     328             : 
     329     7290000 :     if (bi->cno >= 3) {
     330     2431630 :         bi->cno = 3;
     331     2431630 :         prev    = 0;
     332     2431630 :         i       = bi->next[prev];
     333    12158150 :         for (area = 0; area < 4; area++) {
     334     9726520 :             bi->prev[area]     = prev;
     335     9726520 :             bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
     336    52713966 :             for (; i < mb_area_start[area + 1]; i = bi->next[i]) {
     337    42987446 :                 bi->mb[i] >>= 1;
     338             : 
     339    42987446 :                 if (bi->mb[i]) {
     340    25006098 :                     bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
     341    25006098 :                     bi->next[prev]      = i;
     342    25006098 :                     prev                = i;
     343             :                 }
     344             :             }
     345             :         }
     346     2431630 :         bi->next[prev] = i;
     347             :     }
     348             : 
     349    14580000 :     return bi->bit_size[0] + bi->bit_size[1] +
     350    14580000 :            bi->bit_size[2] + bi->bit_size[3];
     351             : }
     352             : 
     353      134212 : static inline void dv_guess_qnos(EncBlockInfo *blks, int *qnos)
     354             : {
     355             :     int size[5];
     356             :     int i, j, k, a, prev, a2;
     357             :     EncBlockInfo *b;
     358             : 
     359      134212 :     size[0] =
     360      134212 :     size[1] =
     361      134212 :     size[2] =
     362      134212 :     size[3] =
     363      134212 :     size[4] = 1 << 24;
     364             :     do {
     365      664729 :         b = blks;
     366     3589287 :         for (i = 0; i < 5; i++) {
     367     3058770 :             if (!qnos[i])
     368           0 :                 continue;
     369             : 
     370     3058770 :             qnos[i]--;
     371     3058770 :             size[i] = 0;
     372    21411390 :             for (j = 0; j < 6; j++, b++) {
     373    91763100 :                 for (a = 0; a < 4; a++) {
     374    73410480 :                     if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
     375    14357792 :                         b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
     376    14357792 :                         b->area_q[a]++;
     377    14357792 :                         prev = b->prev[a];
     378             :                         av_assert2(b->next[prev] >= mb_area_start[a + 1] || b->mb[prev]);
     379    75596456 :                         for (k = b->next[prev]; k < mb_area_start[a + 1]; k = b->next[k]) {
     380    61238664 :                             b->mb[k] >>= 1;
     381    61238664 :                             if (b->mb[k]) {
     382    37590212 :                                 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
     383    37590212 :                                 prev            = k;
     384             :                             } else {
     385    23648452 :                                 if (b->next[k] >= mb_area_start[a + 1] && b->next[k] < 64) {
     386     1130140 :                                     for (a2 = a + 1; b->next[k] >= mb_area_start[a2 + 1]; a2++)
     387          76 :                                         b->prev[a2] = prev;
     388             :                                     av_assert2(a2 < 4);
     389             :                                     av_assert2(b->mb[b->next[k]]);
     390     2260128 :                                     b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) -
     391     1130064 :                                                        dv_rl2vlc_size(b->next[k] - k    - 1, b->mb[b->next[k]]);
     392             :                                     av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2 + 1] != k));
     393     1130064 :                                     b->prev[a2] = prev;
     394             :                                 }
     395    23648452 :                                 b->next[prev] = b->next[k];
     396             :                             }
     397             :                         }
     398    14357792 :                         b->prev[a + 1] = prev;
     399             :                     }
     400    73410480 :                     size[i] += b->bit_size[a];
     401             :                 }
     402             :             }
     403     3058770 :             if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
     404      134212 :                 return;
     405             :         }
     406      530517 :     } while (qnos[0] | qnos[1] | qnos[2] | qnos[3] | qnos[4]);
     407             : 
     408           0 :     for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a) {
     409           0 :         b       = blks;
     410           0 :         size[0] = 5 * 6 * 4; // EOB
     411           0 :         for (j = 0; j < 6 * 5; j++, b++) {
     412           0 :             prev = b->prev[0];
     413           0 :             for (k = b->next[prev]; k < 64; k = b->next[k]) {
     414           0 :                 if (b->mb[k] < a && b->mb[k] > -a) {
     415           0 :                     b->next[prev] = b->next[k];
     416             :                 } else {
     417           0 :                     size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
     418           0 :                     prev     = k;
     419             :                 }
     420             :             }
     421             :         }
     422             :     }
     423             : }
     424             : 
     425      243000 : static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
     426             : {
     427      243000 :     DVVideoContext *s = avctx->priv_data;
     428      243000 :     DVwork_chunk *work_chunk = arg;
     429             :     int mb_index, i, j;
     430             :     int mb_x, mb_y, c_offset;
     431             :     ptrdiff_t linesize, y_stride;
     432             :     uint8_t *y_ptr;
     433             :     uint8_t *dif;
     434      243000 :     LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
     435             :     EncBlockInfo enc_blks[5 * DV_MAX_BPM];
     436             :     PutBitContext pbs[5 * DV_MAX_BPM];
     437             :     PutBitContext *pb;
     438             :     EncBlockInfo *enc_blk;
     439      243000 :     int vs_bit_size = 0;
     440      243000 :     int qnos[5] = { 15, 15, 15, 15, 15 }; /* No quantization */
     441      243000 :     int *qnosp = &qnos[0];
     442             : 
     443      243000 :     dif     = &s->buf[work_chunk->buf_offset * 80];
     444      243000 :     enc_blk = &enc_blks[0];
     445     1458000 :     for (mb_index = 0; mb_index < 5; mb_index++) {
     446     1215000 :         dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
     447             : 
     448             :         /* initializing luminance blocks */
     449     2065500 :         if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P)                      ||
     450     1978200 :             (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
     451      844200 :             (s->sys->height >= 720 && mb_y != 134)) {
     452      370800 :             y_stride = s->frame->linesize[0] << 3;
     453             :         } else {
     454      844200 :             y_stride = 16;
     455             :         }
     456     2430000 :         y_ptr    = s->frame->data[0] +
     457     1215000 :                    ((mb_y * s->frame->linesize[0] + mb_x) << 3);
     458     1215000 :         linesize = s->frame->linesize[0];
     459             : 
     460     1215000 :         if (s->sys->video_stype == 4) { /* SD 422 */
     461      567000 :             vs_bit_size +=
     462     1134000 :                 dv_init_enc_block(enc_blk + 0, y_ptr,                linesize, s, 0) +
     463     1134000 :                 dv_init_enc_block(enc_blk + 1, NULL,                 linesize, s, 0) +
     464     1134000 :                 dv_init_enc_block(enc_blk + 2, y_ptr + 8,            linesize, s, 0) +
     465      567000 :                 dv_init_enc_block(enc_blk + 3, NULL,                 linesize, s, 0);
     466             :         } else {
     467      648000 :             vs_bit_size +=
     468     1296000 :                 dv_init_enc_block(enc_blk + 0, y_ptr,                linesize, s, 0) +
     469     1296000 :                 dv_init_enc_block(enc_blk + 1, y_ptr + 8,            linesize, s, 0) +
     470     1296000 :                 dv_init_enc_block(enc_blk + 2, y_ptr +     y_stride, linesize, s, 0) +
     471      648000 :                 dv_init_enc_block(enc_blk + 3, y_ptr + 8 + y_stride, linesize, s, 0);
     472             :         }
     473     1215000 :         enc_blk += 4;
     474             : 
     475             :         /* initializing chrominance blocks */
     476     2430000 :         c_offset = (((mb_y >>  (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
     477     1215000 :                      (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
     478     3645000 :         for (j = 2; j; j--) {
     479     2430000 :             uint8_t *c_ptr = s->frame->data[j] + c_offset;
     480     2430000 :             linesize = s->frame->linesize[j];
     481     2430000 :             y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
     482     2430000 :             if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
     483             :                 uint8_t *d;
     484       12600 :                 uint8_t *b = scratch;
     485      113400 :                 for (i = 0; i < 8; i++) {
     486      100800 :                     d      = c_ptr + (linesize << 3);
     487      100800 :                     b[0]   = c_ptr[0];
     488      100800 :                     b[1]   = c_ptr[1];
     489      100800 :                     b[2]   = c_ptr[2];
     490      100800 :                     b[3]   = c_ptr[3];
     491      100800 :                     b[4]   = d[0];
     492      100800 :                     b[5]   = d[1];
     493      100800 :                     b[6]   = d[2];
     494      100800 :                     b[7]   = d[3];
     495      100800 :                     c_ptr += linesize;
     496      100800 :                     b     += 16;
     497             :                 }
     498       12600 :                 c_ptr    = scratch;
     499       12600 :                 linesize = 16;
     500             :             }
     501             : 
     502     2430000 :             vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr, linesize, s, 1);
     503     2430000 :             if (s->sys->bpm == 8)
     504           0 :                 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride,
     505             :                                                  linesize, s, 1);
     506             :         }
     507             :     }
     508             : 
     509      243000 :     if (vs_total_ac_bits < vs_bit_size)
     510      134212 :         dv_guess_qnos(&enc_blks[0], qnosp);
     511             : 
     512             :     /* DIF encoding process */
     513     1701000 :     for (j = 0; j < 5 * s->sys->bpm;) {
     514     1215000 :         int start_mb = j;
     515             : 
     516     1215000 :         dif[3] = *qnosp++;
     517     1215000 :         dif   += 4;
     518             : 
     519             :         /* First pass over individual cells only */
     520     8505000 :         for (i = 0; i < s->sys->bpm; i++, j++) {
     521     7290000 :             int sz = s->sys->block_sizes[i] >> 3;
     522             : 
     523     7290000 :             init_put_bits(&pbs[j], dif, sz);
     524     7290000 :             put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
     525     7290000 :             put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
     526     7290000 :             put_bits(&pbs[j], 2, enc_blks[j].cno);
     527             : 
     528     7290000 :             dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j + 1]);
     529     7290000 :             dif += sz;
     530             :         }
     531             : 
     532             :         /* Second pass over each MB space */
     533     1215000 :         pb = &pbs[start_mb];
     534     8505000 :         for (i = 0; i < s->sys->bpm; i++)
     535     7290000 :             if (enc_blks[start_mb + i].partial_bit_count)
     536     2565183 :                 pb = dv_encode_ac(&enc_blks[start_mb + i], pb,
     537     2565183 :                                   &pbs[start_mb + s->sys->bpm]);
     538             :     }
     539             : 
     540             :     /* Third and final pass over the whole video segment space */
     541      243000 :     pb = &pbs[0];
     542     7533000 :     for (j = 0; j < 5 * s->sys->bpm; j++) {
     543     7290000 :         if (enc_blks[j].partial_bit_count)
     544     1394691 :             pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm * 5]);
     545     7290000 :         if (enc_blks[j].partial_bit_count)
     546           0 :             av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
     547             :     }
     548             : 
     549     7533000 :     for (j = 0; j < 5 * s->sys->bpm; j++) {
     550             :         int pos;
     551     7290000 :         int size = pbs[j].size_in_bits >> 3;
     552     7290000 :         flush_put_bits(&pbs[j]);
     553     7290000 :         pos = put_bits_count(&pbs[j]) >> 3;
     554     7290000 :         if (pos > size) {
     555           0 :             av_log(avctx, AV_LOG_ERROR,
     556             :                    "bitstream written beyond buffer size\n");
     557           0 :             return -1;
     558             :         }
     559     7290000 :         memset(pbs[j].buf + pos, 0xff, size - pos);
     560             :     }
     561             : 
     562      243000 :     return 0;
     563             : }
     564             : 
     565      117000 : static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
     566             :                                 uint8_t *buf)
     567             : {
     568             :     /*
     569             :      * Here's what SMPTE314M says about these two:
     570             :      *    (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
     571             :      *             as track application IDs (APTn = 001, AP1n =
     572             :      *             001, AP2n = 001, AP3n = 001), if the source signal
     573             :      *             comes from a digital VCR. If the signal source is
     574             :      *             unknown, all bits for these data shall be set to 1.
     575             :      *    (page 12) STYPE: STYPE defines a signal type of video signal
     576             :      *                     00000b = 4:1:1 compression
     577             :      *                     00100b = 4:2:2 compression
     578             :      *                     XXXXXX = Reserved
     579             :      * Now, I've got two problems with these statements:
     580             :      *   1. it looks like APT == 111b should be a safe bet, but it isn't.
     581             :      *      It seems that for PAL as defined in IEC 61834 we have to set
     582             :      *      APT to 000 and for SMPTE314M to 001.
     583             :      *   2. It is not at all clear what STYPE is used for 4:2:0 PAL
     584             :      *      compression scheme (if any).
     585             :      */
     586      117000 :     int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
     587      117000 :     int fs  = c->frame->top_field_first ? 0x00 : 0x40;
     588             : 
     589      117000 :     uint8_t aspect = 0;
     590      351000 :     if ((int) (av_q2d(c->avctx->sample_aspect_ratio) *
     591      234000 :                c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
     592        7800 :         aspect = 0x02;
     593             : 
     594      117000 :     buf[0] = (uint8_t) pack_id;
     595      117000 :     switch (pack_id) {
     596        9000 :     case dv_header525: /* I can't imagine why these two weren't defined as real */
     597             :     case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
     598        9000 :         buf[1] =  0xf8       | /* reserved -- always 1 */
     599             :                  (apt & 0x07); /* APT: Track application ID */
     600       18000 :         buf[2] = (0    << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
     601       18000 :                  (0x0f << 3) | /* reserved -- always 1 */
     602        9000 :                  (apt & 0x07); /* AP1: Audio application ID */
     603       18000 :         buf[3] = (0    << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
     604       18000 :                  (0x0f << 3) | /* reserved -- always 1 */
     605        9000 :                  (apt & 0x07); /* AP2: Video application ID */
     606       18000 :         buf[4] = (0    << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
     607       18000 :                  (0x0f << 3) | /* reserved -- always 1 */
     608        9000 :                  (apt & 0x07); /* AP3: Subcode application ID */
     609        9000 :         break;
     610       54000 :     case dv_video_source:
     611       54000 :         buf[1] = 0xff;         /* reserved -- always 1 */
     612       54000 :         buf[2] = (1 << 7) |    /* B/W: 0 - b/w, 1 - color */
     613             :                  (1 << 6) |    /* following CLF is valid - 0, invalid - 1 */
     614             :                  (3 << 4) |    /* CLF: color frames ID (see ITU-R BT.470-4) */
     615             :                  0xf;          /* reserved -- always 1 */
     616      162000 :         buf[3] = (3 << 6)           | /* reserved -- always 1 */
     617      162000 :                  (c->sys->dsf << 5) | /*  system: 60fields/50fields */
     618       54000 :                  c->sys->video_stype; /* signal type video compression */
     619       54000 :         buf[4] = 0xff;         /* VISC: 0xff -- no information */
     620       54000 :         break;
     621       54000 :     case dv_video_control:
     622       54000 :         buf[1] = (0 << 6) |    /* Copy generation management (CGMS) 0 -- free */
     623             :                  0x3f;         /* reserved -- always 1 */
     624       54000 :         buf[2] = 0xc8 |        /* reserved -- always b11001xxx */
     625             :                  aspect;
     626      108000 :         buf[3] = (1 << 7) |    /* frame/field flag 1 -- frame, 0 -- field */
     627             :                  fs       |    /* first/second field flag 0 -- field 2, 1 -- field 1 */
     628             :                  (1 << 5) |    /* frame change flag 0 -- same picture as before, 1 -- different */
     629      108000 :                  (1 << 4) |    /* 1 - interlaced, 0 - noninterlaced */
     630             :                  0xc;          /* reserved -- always b1100 */
     631       54000 :         buf[4] = 0xff;         /* reserved -- always 1 */
     632       54000 :         break;
     633           0 :     default:
     634           0 :         buf[1] =
     635           0 :         buf[2] =
     636           0 :         buf[3] =
     637           0 :         buf[4] = 0xff;
     638             :     }
     639      117000 :     return 5;
     640             : }
     641             : 
     642     1350000 : static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
     643             :                                   uint8_t seq_num, uint8_t dif_num,
     644             :                                   uint8_t *buf)
     645             : {
     646     1350000 :     buf[0] = (uint8_t) t;      /* Section type */
     647     5400000 :     buf[1] = (seq_num  << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
     648     4050000 :              (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
     649             :              7;                /* reserved -- always 1 */
     650     1350000 :     buf[2] = dif_num;          /* DIF block number Video: 0-134, Audio: 0-8 */
     651     1350000 :     return 3;
     652             : }
     653             : 
     654      108000 : static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t *buf)
     655             : {
     656      108000 :     if (syb_num == 0 || syb_num == 6) {
     657       36000 :         buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
     658       18000 :                  (0  << 4) | /* AP3 (Subcode application ID) */
     659             :                  0x0f;       /* reserved -- always 1 */
     660       90000 :     } else if (syb_num == 11) {
     661           0 :         buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
     662             :                  0x7f;       /* reserved -- always 1 */
     663             :     } else {
     664      180000 :         buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
     665       90000 :                  (0  << 4) | /* APT (Track application ID) */
     666             :                  0x0f;       /* reserved -- always 1 */
     667             :     }
     668      108000 :     buf[1] = 0xf0 |            /* reserved -- always 1 */
     669             :              (syb_num & 0x0f); /* SSYB number 0 - 11   */
     670      108000 :     buf[2] = 0xff;             /* reserved -- always 1 */
     671      108000 :     return 3;
     672             : }
     673             : 
     674         580 : static void dv_format_frame(DVVideoContext *c, uint8_t *buf)
     675             : {
     676             :     int chan, i, j, k;
     677             : 
     678        1335 :     for (chan = 0; chan < c->sys->n_difchan; chan++) {
     679        9755 :         for (i = 0; i < c->sys->difseg_size; i++) {
     680        9000 :             memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
     681             : 
     682             :             /* DV header: 1DIF */
     683        9000 :             buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
     684        9000 :             buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525),
     685             :                                  c, buf);
     686        9000 :             buf += 72; /* unused bytes */
     687             : 
     688             :             /* DV subcode: 2DIFs */
     689       27000 :             for (j = 0; j < 2; j++) {
     690       18000 :                 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
     691      126000 :                 for (k = 0; k < 6; k++)
     692      108000 :                     buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size / 2), buf) + 5;
     693       18000 :                 buf += 29; /* unused bytes */
     694             :             }
     695             : 
     696             :             /* DV VAUX: 3DIFS */
     697       36000 :             for (j = 0; j < 3; j++) {
     698       27000 :                 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
     699       27000 :                 buf += dv_write_pack(dv_video_source,  c, buf);
     700       27000 :                 buf += dv_write_pack(dv_video_control, c, buf);
     701       27000 :                 buf += 7 * 5;
     702       27000 :                 buf += dv_write_pack(dv_video_source,  c, buf);
     703       27000 :                 buf += dv_write_pack(dv_video_control, c, buf);
     704       27000 :                 buf += 4 * 5 + 2; /* unused bytes */
     705             :             }
     706             : 
     707             :             /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
     708     1224000 :             for (j = 0; j < 135; j++) {
     709     1215000 :                 if (j % 15 == 0) {
     710       81000 :                     memset(buf, 0xff, 80);
     711       81000 :                     buf += dv_write_dif_id(dv_sect_audio, chan, i, j / 15, buf);
     712       81000 :                     buf += 77; /* audio control & shuffled PCM audio */
     713             :                 }
     714     1215000 :                 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
     715     1215000 :                 buf += 77; /* 1 video macroblock: 1 bytes control
     716             :                             * 4 * 14 bytes Y 8x8 data
     717             :                             * 10 bytes Cr 8x8 data
     718             :                             * 10 bytes Cb 8x8 data */
     719             :             }
     720             :         }
     721             :     }
     722         580 : }
     723             : 
     724         580 : static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
     725             :                                 const AVFrame *frame, int *got_packet)
     726             : {
     727         580 :     DVVideoContext *s = c->priv_data;
     728             :     int ret;
     729             : 
     730         580 :     if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size, 0)) < 0)
     731           0 :         return ret;
     732             : 
     733         580 :     c->pix_fmt                = s->sys->pix_fmt;
     734         580 :     s->frame                  = frame;
     735             : #if FF_API_CODED_FRAME
     736             : FF_DISABLE_DEPRECATION_WARNINGS
     737         580 :     c->coded_frame->key_frame = 1;
     738         580 :     c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
     739             : FF_ENABLE_DEPRECATION_WARNINGS
     740             : #endif
     741             : 
     742         580 :     s->buf = pkt->data;
     743         580 :     c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
     744             :                dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
     745             : 
     746         580 :     emms_c();
     747             : 
     748         580 :     dv_format_frame(s, pkt->data);
     749             : 
     750         580 :     pkt->flags |= AV_PKT_FLAG_KEY;
     751         580 :     *got_packet = 1;
     752             : 
     753         580 :     return 0;
     754             : }
     755             : 
     756             : #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
     757             : #define OFFSET(x) offsetof(DVVideoContext, x)
     758             : static const AVOption dv_options[] = {
     759             :     { "quant_deadzone",        "Quantizer dead zone",    OFFSET(quant_deadzone),       AV_OPT_TYPE_INT, { .i64 = 7 }, 0, 1024, VE },
     760             :     { NULL },
     761             : };
     762             : 
     763             : static const AVClass dvvideo_encode_class = {
     764             :     .class_name = "dvvideo encoder",
     765             :     .item_name  = av_default_item_name,
     766             :     .option     = dv_options,
     767             :     .version    = LIBAVUTIL_VERSION_INT,
     768             : };
     769             : 
     770             : AVCodec ff_dvvideo_encoder = {
     771             :     .name           = "dvvideo",
     772             :     .long_name      = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
     773             :     .type           = AVMEDIA_TYPE_VIDEO,
     774             :     .id             = AV_CODEC_ID_DVVIDEO,
     775             :     .priv_data_size = sizeof(DVVideoContext),
     776             :     .init           = dvvideo_encode_init,
     777             :     .encode2        = dvvideo_encode_frame,
     778             :     .capabilities   = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
     779             :     .pix_fmts       = (const enum AVPixelFormat[]) {
     780             :         AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P,
     781             :         AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
     782             :     },
     783             :     .priv_class     = &dvvideo_encode_class,
     784             : };

Generated by: LCOV version 1.13