Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * SVQ1 Encoder
  3.  * Copyright (C) 2004 Mike Melanson <melanson@pcisys.net>
  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.  
  22. /**
  23.  * @file
  24.  * Sorenson Vector Quantizer #1 (SVQ1) video codec.
  25.  * For more information of the SVQ1 algorithm, visit:
  26.  *   http://www.pcisys.net/~melanson/codecs/
  27.  */
  28.  
  29. #include "avcodec.h"
  30. #include "dsputil.h"
  31. #include "hpeldsp.h"
  32. #include "mpegvideo.h"
  33. #include "h263.h"
  34. #include "internal.h"
  35. #include "libavutil/avassert.h"
  36. #include "svq1.h"
  37. #include "svq1enc_cb.h"
  38.  
  39.  
  40. typedef struct SVQ1Context {
  41.     /* FIXME: Needed for motion estimation, should not be used for anything
  42.      * else, the idea is to make the motion estimation eventually independent
  43.      * of MpegEncContext, so this will be removed then. */
  44.     MpegEncContext m;
  45.     AVCodecContext *avctx;
  46.     DSPContext dsp;
  47.     HpelDSPContext hdsp;
  48.     AVFrame picture;
  49.     AVFrame current_picture;
  50.     AVFrame last_picture;
  51.     PutBitContext pb;
  52.     GetBitContext gb;
  53.  
  54.     /* why ooh why this sick breadth first order,
  55.      * everything is slower and more complex */
  56.     PutBitContext reorder_pb[6];
  57.  
  58.     int frame_width;
  59.     int frame_height;
  60.  
  61.     /* Y plane block dimensions */
  62.     int y_block_width;
  63.     int y_block_height;
  64.  
  65.     /* U & V plane (C planes) block dimensions */
  66.     int c_block_width;
  67.     int c_block_height;
  68.  
  69.     uint16_t *mb_type;
  70.     uint32_t *dummy;
  71.     int16_t (*motion_val8[3])[2];
  72.     int16_t (*motion_val16[3])[2];
  73.  
  74.     int64_t rd_total;
  75.  
  76.     uint8_t *scratchbuf;
  77. } SVQ1Context;
  78.  
  79. static void svq1_write_header(SVQ1Context *s, int frame_type)
  80. {
  81.     int i;
  82.  
  83.     /* frame code */
  84.     put_bits(&s->pb, 22, 0x20);
  85.  
  86.     /* temporal reference (sure hope this is a "don't care") */
  87.     put_bits(&s->pb, 8, 0x00);
  88.  
  89.     /* frame type */
  90.     put_bits(&s->pb, 2, frame_type - 1);
  91.  
  92.     if (frame_type == AV_PICTURE_TYPE_I) {
  93.         /* no checksum since frame code is 0x20 */
  94.         /* no embedded string either */
  95.         /* output 5 unknown bits (2 + 2 + 1) */
  96.         put_bits(&s->pb, 5, 2); /* 2 needed by quicktime decoder */
  97.  
  98.         i = ff_match_2uint16((void*)ff_svq1_frame_size_table,
  99.                              FF_ARRAY_ELEMS(ff_svq1_frame_size_table),
  100.                              s->frame_width, s->frame_height);
  101.         put_bits(&s->pb, 3, i);
  102.  
  103.         if (i == 7) {
  104.             put_bits(&s->pb, 12, s->frame_width);
  105.             put_bits(&s->pb, 12, s->frame_height);
  106.         }
  107.     }
  108.  
  109.     /* no checksum or extra data (next 2 bits get 0) */
  110.     put_bits(&s->pb, 2, 0);
  111. }
  112.  
  113. #define QUALITY_THRESHOLD    100
  114. #define THRESHOLD_MULTIPLIER 0.6
  115.  
  116. static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref,
  117.                         uint8_t *decoded, int stride, int level,
  118.                         int threshold, int lambda, int intra)
  119. {
  120.     int count, y, x, i, j, split, best_mean, best_score, best_count;
  121.     int best_vector[6];
  122.     int block_sum[7] = { 0, 0, 0, 0, 0, 0 };
  123.     int w            = 2 << (level + 2 >> 1);
  124.     int h            = 2 << (level + 1 >> 1);
  125.     int size         = w * h;
  126.     int16_t block[7][256];
  127.     const int8_t *codebook_sum, *codebook;
  128.     const uint16_t(*mean_vlc)[2];
  129.     const uint8_t(*multistage_vlc)[2];
  130.  
  131.     best_score = 0;
  132.     // FIXME: Optimize, this does not need to be done multiple times.
  133.     if (intra) {
  134.         codebook_sum   = svq1_intra_codebook_sum[level];
  135.         codebook       = ff_svq1_intra_codebooks[level];
  136.         mean_vlc       = ff_svq1_intra_mean_vlc;
  137.         multistage_vlc = ff_svq1_intra_multistage_vlc[level];
  138.         for (y = 0; y < h; y++) {
  139.             for (x = 0; x < w; x++) {
  140.                 int v = src[x + y * stride];
  141.                 block[0][x + w * y] = v;
  142.                 best_score         += v * v;
  143.                 block_sum[0]       += v;
  144.             }
  145.         }
  146.     } else {
  147.         codebook_sum   = svq1_inter_codebook_sum[level];
  148.         codebook       = ff_svq1_inter_codebooks[level];
  149.         mean_vlc       = ff_svq1_inter_mean_vlc + 256;
  150.         multistage_vlc = ff_svq1_inter_multistage_vlc[level];
  151.         for (y = 0; y < h; y++) {
  152.             for (x = 0; x < w; x++) {
  153.                 int v = src[x + y * stride] - ref[x + y * stride];
  154.                 block[0][x + w * y] = v;
  155.                 best_score         += v * v;
  156.                 block_sum[0]       += v;
  157.             }
  158.         }
  159.     }
  160.  
  161.     best_count  = 0;
  162.     best_score -= (int)((unsigned)block_sum[0] * block_sum[0] >> (level + 3));
  163.     best_mean   = block_sum[0] + (size >> 1) >> (level + 3);
  164.  
  165.     if (level < 4) {
  166.         for (count = 1; count < 7; count++) {
  167.             int best_vector_score = INT_MAX;
  168.             int best_vector_sum   = -999, best_vector_mean = -999;
  169.             const int stage       = count - 1;
  170.             const int8_t *vector;
  171.  
  172.             for (i = 0; i < 16; i++) {
  173.                 int sum = codebook_sum[stage * 16 + i];
  174.                 int sqr, diff, score;
  175.  
  176.                 vector = codebook + stage * size * 16 + i * size;
  177.                 sqr    = s->dsp.ssd_int8_vs_int16(vector, block[stage], size);
  178.                 diff   = block_sum[stage] - sum;
  179.                 score  = sqr - (diff * (int64_t)diff >> (level + 3)); // FIXME: 64bit slooow
  180.                 if (score < best_vector_score) {
  181.                     int mean = diff + (size >> 1) >> (level + 3);
  182.                     av_assert2(mean > -300 && mean < 300);
  183.                     mean               = av_clip(mean, intra ? 0 : -256, 255);
  184.                     best_vector_score  = score;
  185.                     best_vector[stage] = i;
  186.                     best_vector_sum    = sum;
  187.                     best_vector_mean   = mean;
  188.                 }
  189.             }
  190.             av_assert0(best_vector_mean != -999);
  191.             vector = codebook + stage * size * 16 + best_vector[stage] * size;
  192.             for (j = 0; j < size; j++)
  193.                 block[stage + 1][j] = block[stage][j] - vector[j];
  194.             block_sum[stage + 1] = block_sum[stage] - best_vector_sum;
  195.             best_vector_score   += lambda *
  196.                                    (+1 + 4 * count +
  197.                                     multistage_vlc[1 + count][1]
  198.                                     + mean_vlc[best_vector_mean][1]);
  199.  
  200.             if (best_vector_score < best_score) {
  201.                 best_score = best_vector_score;
  202.                 best_count = count;
  203.                 best_mean  = best_vector_mean;
  204.             }
  205.         }
  206.     }
  207.  
  208.     split = 0;
  209.     if (best_score > threshold && level) {
  210.         int score  = 0;
  211.         int offset = level & 1 ? stride * h / 2 : w / 2;
  212.         PutBitContext backup[6];
  213.  
  214.         for (i = level - 1; i >= 0; i--)
  215.             backup[i] = s->reorder_pb[i];
  216.         score += encode_block(s, src, ref, decoded, stride, level - 1,
  217.                               threshold >> 1, lambda, intra);
  218.         score += encode_block(s, src + offset, ref + offset, decoded + offset,
  219.                               stride, level - 1, threshold >> 1, lambda, intra);
  220.         score += lambda;
  221.  
  222.         if (score < best_score) {
  223.             best_score = score;
  224.             split      = 1;
  225.         } else {
  226.             for (i = level - 1; i >= 0; i--)
  227.                 s->reorder_pb[i] = backup[i];
  228.         }
  229.     }
  230.     if (level > 0)
  231.         put_bits(&s->reorder_pb[level], 1, split);
  232.  
  233.     if (!split) {
  234.         av_assert1(best_mean >= 0 && best_mean < 256 || !intra);
  235.         av_assert1(best_mean >= -256 && best_mean < 256);
  236.         av_assert1(best_count >= 0 && best_count < 7);
  237.         av_assert1(level < 4 || best_count == 0);
  238.  
  239.         /* output the encoding */
  240.         put_bits(&s->reorder_pb[level],
  241.                  multistage_vlc[1 + best_count][1],
  242.                  multistage_vlc[1 + best_count][0]);
  243.         put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
  244.                  mean_vlc[best_mean][0]);
  245.  
  246.         for (i = 0; i < best_count; i++) {
  247.             av_assert2(best_vector[i] >= 0 && best_vector[i] < 16);
  248.             put_bits(&s->reorder_pb[level], 4, best_vector[i]);
  249.         }
  250.  
  251.         for (y = 0; y < h; y++)
  252.             for (x = 0; x < w; x++)
  253.                 decoded[x + y * stride] = src[x + y * stride] -
  254.                                           block[best_count][x + w * y] +
  255.                                           best_mean;
  256.     }
  257.  
  258.     return best_score;
  259. }
  260.  
  261. static int svq1_encode_plane(SVQ1Context *s, int plane,
  262.                              unsigned char *src_plane,
  263.                              unsigned char *ref_plane,
  264.                              unsigned char *decoded_plane,
  265.                              int width, int height, int src_stride, int stride)
  266. {
  267.     int x, y;
  268.     int i;
  269.     int block_width, block_height;
  270.     int level;
  271.     int threshold[6];
  272.     uint8_t *src     = s->scratchbuf + stride * 16;
  273.     const int lambda = (s->picture.quality * s->picture.quality) >>
  274.                        (2 * FF_LAMBDA_SHIFT);
  275.  
  276.     /* figure out the acceptable level thresholds in advance */
  277.     threshold[5] = QUALITY_THRESHOLD;
  278.     for (level = 4; level >= 0; level--)
  279.         threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
  280.  
  281.     block_width  = (width  + 15) / 16;
  282.     block_height = (height + 15) / 16;
  283.  
  284.     if (s->picture.pict_type == AV_PICTURE_TYPE_P) {
  285.         s->m.avctx                         = s->avctx;
  286.         s->m.current_picture_ptr           = &s->m.current_picture;
  287.         s->m.last_picture_ptr              = &s->m.last_picture;
  288.         s->m.last_picture.f.data[0]        = ref_plane;
  289.         s->m.linesize                      =
  290.         s->m.last_picture.f.linesize[0]    =
  291.         s->m.new_picture.f.linesize[0]     =
  292.         s->m.current_picture.f.linesize[0] = stride;
  293.         s->m.width                         = width;
  294.         s->m.height                        = height;
  295.         s->m.mb_width                      = block_width;
  296.         s->m.mb_height                     = block_height;
  297.         s->m.mb_stride                     = s->m.mb_width + 1;
  298.         s->m.b8_stride                     = 2 * s->m.mb_width + 1;
  299.         s->m.f_code                        = 1;
  300.         s->m.pict_type                     = s->picture.pict_type;
  301.         s->m.me_method                     = s->avctx->me_method;
  302.         s->m.me.scene_change_score         = 0;
  303.         s->m.flags                         = s->avctx->flags;
  304.         // s->m.out_format                    = FMT_H263;
  305.         // s->m.unrestricted_mv               = 1;
  306.         s->m.lambda                        = s->picture.quality;
  307.         s->m.qscale                        = s->m.lambda * 139 +
  308.                                              FF_LAMBDA_SCALE * 64 >>
  309.                                              FF_LAMBDA_SHIFT + 7;
  310.         s->m.lambda2                       = s->m.lambda * s->m.lambda +
  311.                                              FF_LAMBDA_SCALE / 2 >>
  312.                                              FF_LAMBDA_SHIFT;
  313.  
  314.         if (!s->motion_val8[plane]) {
  315.             s->motion_val8[plane]  = av_mallocz((s->m.b8_stride *
  316.                                                  block_height * 2 + 2) *
  317.                                                 2 * sizeof(int16_t));
  318.             s->motion_val16[plane] = av_mallocz((s->m.mb_stride *
  319.                                                  (block_height + 2) + 1) *
  320.                                                 2 * sizeof(int16_t));
  321.         }
  322.  
  323.         s->m.mb_type = s->mb_type;
  324.  
  325.         // dummies, to avoid segfaults
  326.         s->m.current_picture.mb_mean   = (uint8_t *)s->dummy;
  327.         s->m.current_picture.mb_var    = (uint16_t *)s->dummy;
  328.         s->m.current_picture.mc_mb_var = (uint16_t *)s->dummy;
  329.         s->m.current_picture.mb_type = s->dummy;
  330.  
  331.         s->m.current_picture.motion_val[0]   = s->motion_val8[plane] + 2;
  332.         s->m.p_mv_table                      = s->motion_val16[plane] +
  333.                                                s->m.mb_stride + 1;
  334.         s->m.dsp                             = s->dsp; // move
  335.         ff_init_me(&s->m);
  336.  
  337.         s->m.me.dia_size      = s->avctx->dia_size;
  338.         s->m.first_slice_line = 1;
  339.         for (y = 0; y < block_height; y++) {
  340.             s->m.new_picture.f.data[0] = src - y * 16 * stride; // ugly
  341.             s->m.mb_y                  = y;
  342.  
  343.             for (i = 0; i < 16 && i + 16 * y < height; i++) {
  344.                 memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
  345.                        width);
  346.                 for (x = width; x < 16 * block_width; x++)
  347.                     src[i * stride + x] = src[i * stride + x - 1];
  348.             }
  349.             for (; i < 16 && i + 16 * y < 16 * block_height; i++)
  350.                 memcpy(&src[i * stride], &src[(i - 1) * stride],
  351.                        16 * block_width);
  352.  
  353.             for (x = 0; x < block_width; x++) {
  354.                 s->m.mb_x = x;
  355.                 ff_init_block_index(&s->m);
  356.                 ff_update_block_index(&s->m);
  357.  
  358.                 ff_estimate_p_frame_motion(&s->m, x, y);
  359.             }
  360.             s->m.first_slice_line = 0;
  361.         }
  362.  
  363.         ff_fix_long_p_mvs(&s->m);
  364.         ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code,
  365.                         CANDIDATE_MB_TYPE_INTER, 0);
  366.     }
  367.  
  368.     s->m.first_slice_line = 1;
  369.     for (y = 0; y < block_height; y++) {
  370.         for (i = 0; i < 16 && i + 16 * y < height; i++) {
  371.             memcpy(&src[i * stride], &src_plane[(i + 16 * y) * src_stride],
  372.                    width);
  373.             for (x = width; x < 16 * block_width; x++)
  374.                 src[i * stride + x] = src[i * stride + x - 1];
  375.         }
  376.         for (; i < 16 && i + 16 * y < 16 * block_height; i++)
  377.             memcpy(&src[i * stride], &src[(i - 1) * stride], 16 * block_width);
  378.  
  379.         s->m.mb_y = y;
  380.         for (x = 0; x < block_width; x++) {
  381.             uint8_t reorder_buffer[3][6][7 * 32];
  382.             int count[3][6];
  383.             int offset       = y * 16 * stride + x * 16;
  384.             uint8_t *decoded = decoded_plane + offset;
  385.             uint8_t *ref     = ref_plane + offset;
  386.             int score[4]     = { 0, 0, 0, 0 }, best;
  387.             uint8_t *temp    = s->scratchbuf;
  388.  
  389.             if (s->pb.buf_end - s->pb.buf -
  390.                 (put_bits_count(&s->pb) >> 3) < 3000) { // FIXME: check size
  391.                 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
  392.                 return -1;
  393.             }
  394.  
  395.             s->m.mb_x = x;
  396.             ff_init_block_index(&s->m);
  397.             ff_update_block_index(&s->m);
  398.  
  399.             if (s->picture.pict_type == AV_PICTURE_TYPE_I ||
  400.                 (s->m.mb_type[x + y * s->m.mb_stride] &
  401.                  CANDIDATE_MB_TYPE_INTRA)) {
  402.                 for (i = 0; i < 6; i++)
  403.                     init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i],
  404.                                   7 * 32);
  405.                 if (s->picture.pict_type == AV_PICTURE_TYPE_P) {
  406.                     const uint8_t *vlc = ff_svq1_block_type_vlc[SVQ1_BLOCK_INTRA];
  407.                     put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
  408.                     score[0] = vlc[1] * lambda;
  409.                 }
  410.                 score[0] += encode_block(s, src + 16 * x, NULL, temp, stride,
  411.                                          5, 64, lambda, 1);
  412.                 for (i = 0; i < 6; i++) {
  413.                     count[0][i] = put_bits_count(&s->reorder_pb[i]);
  414.                     flush_put_bits(&s->reorder_pb[i]);
  415.                 }
  416.             } else
  417.                 score[0] = INT_MAX;
  418.  
  419.             best = 0;
  420.  
  421.             if (s->picture.pict_type == AV_PICTURE_TYPE_P) {
  422.                 const uint8_t *vlc = ff_svq1_block_type_vlc[SVQ1_BLOCK_INTER];
  423.                 int mx, my, pred_x, pred_y, dxy;
  424.                 int16_t *motion_ptr;
  425.  
  426.                 motion_ptr = ff_h263_pred_motion(&s->m, 0, 0, &pred_x, &pred_y);
  427.                 if (s->m.mb_type[x + y * s->m.mb_stride] &
  428.                     CANDIDATE_MB_TYPE_INTER) {
  429.                     for (i = 0; i < 6; i++)
  430.                         init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i],
  431.                                       7 * 32);
  432.  
  433.                     put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
  434.  
  435.                     s->m.pb = s->reorder_pb[5];
  436.                     mx      = motion_ptr[0];
  437.                     my      = motion_ptr[1];
  438.                     av_assert1(mx     >= -32 && mx     <= 31);
  439.                     av_assert1(my     >= -32 && my     <= 31);
  440.                     av_assert1(pred_x >= -32 && pred_x <= 31);
  441.                     av_assert1(pred_y >= -32 && pred_y <= 31);
  442.                     ff_h263_encode_motion(&s->m, mx - pred_x, 1);
  443.                     ff_h263_encode_motion(&s->m, my - pred_y, 1);
  444.                     s->reorder_pb[5] = s->m.pb;
  445.                     score[1]        += lambda * put_bits_count(&s->reorder_pb[5]);
  446.  
  447.                     dxy = (mx & 1) + 2 * (my & 1);
  448.  
  449.                     s->hdsp.put_pixels_tab[0][dxy](temp + 16,
  450.                                                    ref + (mx >> 1) +
  451.                                                    stride * (my >> 1),
  452.                                                    stride, 16);
  453.  
  454.                     score[1] += encode_block(s, src + 16 * x, temp + 16,
  455.                                              decoded, stride, 5, 64, lambda, 0);
  456.                     best      = score[1] <= score[0];
  457.  
  458.                     vlc       = ff_svq1_block_type_vlc[SVQ1_BLOCK_SKIP];
  459.                     score[2]  = s->dsp.sse[0](NULL, src + 16 * x, ref,
  460.                                               stride, 16);
  461.                     score[2] += vlc[1] * lambda;
  462.                     if (score[2] < score[best] && mx == 0 && my == 0) {
  463.                         best = 2;
  464.                         s->hdsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
  465.                         for (i = 0; i < 6; i++)
  466.                             count[2][i] = 0;
  467.                         put_bits(&s->pb, vlc[1], vlc[0]);
  468.                     }
  469.                 }
  470.  
  471.                 if (best == 1) {
  472.                     for (i = 0; i < 6; i++) {
  473.                         count[1][i] = put_bits_count(&s->reorder_pb[i]);
  474.                         flush_put_bits(&s->reorder_pb[i]);
  475.                     }
  476.                 } else {
  477.                     motion_ptr[0]                      =
  478.                     motion_ptr[1]                      =
  479.                     motion_ptr[2]                      =
  480.                     motion_ptr[3]                      =
  481.                     motion_ptr[0 + 2 * s->m.b8_stride] =
  482.                     motion_ptr[1 + 2 * s->m.b8_stride] =
  483.                     motion_ptr[2 + 2 * s->m.b8_stride] =
  484.                     motion_ptr[3 + 2 * s->m.b8_stride] = 0;
  485.                 }
  486.             }
  487.  
  488.             s->rd_total += score[best];
  489.  
  490.             for (i = 5; i >= 0; i--)
  491.                 avpriv_copy_bits(&s->pb, reorder_buffer[best][i],
  492.                                  count[best][i]);
  493.             if (best == 0)
  494.                 s->hdsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
  495.         }
  496.         s->m.first_slice_line = 0;
  497.     }
  498.     return 0;
  499. }
  500.  
  501. static av_cold int svq1_encode_init(AVCodecContext *avctx)
  502. {
  503.     SVQ1Context *const s = avctx->priv_data;
  504.  
  505.     ff_dsputil_init(&s->dsp, avctx);
  506.     ff_hpeldsp_init(&s->hdsp, avctx->flags);
  507.     avctx->coded_frame = &s->picture;
  508.  
  509.     s->frame_width  = avctx->width;
  510.     s->frame_height = avctx->height;
  511.  
  512.     s->y_block_width  = (s->frame_width  + 15) / 16;
  513.     s->y_block_height = (s->frame_height + 15) / 16;
  514.  
  515.     s->c_block_width  = (s->frame_width  / 4 + 15) / 16;
  516.     s->c_block_height = (s->frame_height / 4 + 15) / 16;
  517.  
  518.     s->avctx               = avctx;
  519.     s->m.avctx             = avctx;
  520.     s->m.picture_structure = PICT_FRAME;
  521.     s->m.me.temp           =
  522.     s->m.me.scratchpad     = av_mallocz((avctx->width + 64) *
  523.                                         2 * 16 * 2 * sizeof(uint8_t));
  524.     s->m.me.map            = av_mallocz(ME_MAP_SIZE * sizeof(uint32_t));
  525.     s->m.me.score_map      = av_mallocz(ME_MAP_SIZE * sizeof(uint32_t));
  526.     s->mb_type             = av_mallocz((s->y_block_width + 1) *
  527.                                         s->y_block_height * sizeof(int16_t));
  528.     s->dummy               = av_mallocz((s->y_block_width + 1) *
  529.                                         s->y_block_height * sizeof(int32_t));
  530.     ff_h263_encode_init(&s->m); // mv_penalty
  531.  
  532.     return 0;
  533. }
  534.  
  535. static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
  536.                              const AVFrame *pict, int *got_packet)
  537. {
  538.     SVQ1Context *const s = avctx->priv_data;
  539.     AVFrame *const p     = &s->picture;
  540.     AVFrame temp;
  541.     int i, ret;
  542.  
  543.     if ((ret = ff_alloc_packet2(avctx, pkt, s->y_block_width * s->y_block_height *
  544.                              MAX_MB_BYTES*3 + FF_MIN_BUFFER_SIZE)) < 0)
  545.         return ret;
  546.  
  547.     if (avctx->pix_fmt != AV_PIX_FMT_YUV410P) {
  548.         av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
  549.         return -1;
  550.     }
  551.  
  552.     if (!s->current_picture.data[0]) {
  553.         if ((ret = ff_get_buffer(avctx, &s->current_picture, 0))< 0 ||
  554.             (ret = ff_get_buffer(avctx, &s->last_picture, 0))   < 0) {
  555.             return ret;
  556.         }
  557.         s->scratchbuf = av_malloc(s->current_picture.linesize[0] * 16 * 2);
  558.     }
  559.  
  560.     av_frame_move_ref(&temp, &s->current_picture);
  561.     av_frame_move_ref(&s->current_picture, &s->last_picture);
  562.     av_frame_move_ref(&s->last_picture, &temp);
  563.  
  564.     init_put_bits(&s->pb, pkt->data, pkt->size);
  565.  
  566.     *p           = *pict;
  567.     p->pict_type = avctx->gop_size && avctx->frame_number % avctx->gop_size ?
  568.                    AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
  569.     p->key_frame = p->pict_type == AV_PICTURE_TYPE_I;
  570.  
  571.     svq1_write_header(s, p->pict_type);
  572.     for (i = 0; i < 3; i++)
  573.         if (svq1_encode_plane(s, i,
  574.                               s->picture.data[i],
  575.                               s->last_picture.data[i],
  576.                               s->current_picture.data[i],
  577.                               s->frame_width  / (i ? 4 : 1),
  578.                               s->frame_height / (i ? 4 : 1),
  579.                               s->picture.linesize[i],
  580.                               s->current_picture.linesize[i]) < 0)
  581.             return -1;
  582.  
  583.     // avpriv_align_put_bits(&s->pb);
  584.     while (put_bits_count(&s->pb) & 31)
  585.         put_bits(&s->pb, 1, 0);
  586.  
  587.     flush_put_bits(&s->pb);
  588.  
  589.     pkt->size = put_bits_count(&s->pb) / 8;
  590.     if (p->pict_type == AV_PICTURE_TYPE_I)
  591.         pkt->flags |= AV_PKT_FLAG_KEY;
  592.     *got_packet = 1;
  593.  
  594.     return 0;
  595. }
  596.  
  597. static av_cold int svq1_encode_end(AVCodecContext *avctx)
  598. {
  599.     SVQ1Context *const s = avctx->priv_data;
  600.     int i;
  601.  
  602.     av_log(avctx, AV_LOG_DEBUG, "RD: %f\n",
  603.            s->rd_total / (double)(avctx->width * avctx->height *
  604.                                   avctx->frame_number));
  605.  
  606.     av_freep(&s->m.me.scratchpad);
  607.     av_freep(&s->m.me.map);
  608.     av_freep(&s->m.me.score_map);
  609.     av_freep(&s->mb_type);
  610.     av_freep(&s->dummy);
  611.     av_freep(&s->scratchbuf);
  612.  
  613.     for (i = 0; i < 3; i++) {
  614.         av_freep(&s->motion_val8[i]);
  615.         av_freep(&s->motion_val16[i]);
  616.     }
  617.  
  618.     av_frame_unref(&s->current_picture);
  619.     av_frame_unref(&s->last_picture);
  620.  
  621.     return 0;
  622. }
  623.  
  624. AVCodec ff_svq1_encoder = {
  625.     .name           = "svq1",
  626.     .long_name      = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
  627.     .type           = AVMEDIA_TYPE_VIDEO,
  628.     .id             = AV_CODEC_ID_SVQ1,
  629.     .priv_data_size = sizeof(SVQ1Context),
  630.     .init           = svq1_encode_init,
  631.     .encode2        = svq1_encode_frame,
  632.     .close          = svq1_encode_end,
  633.     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV410P,
  634.                                                      AV_PIX_FMT_NONE },
  635. };
  636.