Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * FLV Encoding specific code.
  3.  * This file is part of FFmpeg.
  4.  *
  5.  * FFmpeg is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * FFmpeg is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with FFmpeg; if not, write to the Free Software
  17.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18.  */
  19.  
  20. #include "mpegvideo.h"
  21. #include "h263.h"
  22. #include "flv.h"
  23.  
  24. void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
  25. {
  26.       int format;
  27.  
  28.       avpriv_align_put_bits(&s->pb);
  29.  
  30.       put_bits(&s->pb, 17, 1);
  31.       put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
  32.       put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
  33.                            s->avctx->time_base.den) & 0xff); /* TemporalReference */
  34.       if (s->width == 352 && s->height == 288)
  35.         format = 2;
  36.       else if (s->width == 176 && s->height == 144)
  37.         format = 3;
  38.       else if (s->width == 128 && s->height == 96)
  39.         format = 4;
  40.       else if (s->width == 320 && s->height == 240)
  41.         format = 5;
  42.       else if (s->width == 160 && s->height == 120)
  43.         format = 6;
  44.       else if (s->width <= 255 && s->height <= 255)
  45.         format = 0; /* use 1 byte width & height */
  46.       else
  47.         format = 1; /* use 2 bytes width & height */
  48.       put_bits(&s->pb, 3, format); /* PictureSize */
  49.       if (format == 0) {
  50.         put_bits(&s->pb, 8, s->width);
  51.         put_bits(&s->pb, 8, s->height);
  52.       } else if (format == 1) {
  53.         put_bits(&s->pb, 16, s->width);
  54.         put_bits(&s->pb, 16, s->height);
  55.       }
  56.       put_bits(&s->pb, 2, s->pict_type == AV_PICTURE_TYPE_P); /* PictureType */
  57.       put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
  58.       put_bits(&s->pb, 5, s->qscale); /* Quantizer */
  59.       put_bits(&s->pb, 1, 0); /* ExtraInformation */
  60.  
  61.       if(s->h263_aic){
  62.         s->y_dc_scale_table=
  63.           s->c_dc_scale_table= ff_aic_dc_scale_table;
  64.       }else{
  65.         s->y_dc_scale_table=
  66.           s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
  67.       }
  68. }
  69.  
  70. void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run, int last){
  71.     if(level < 64) { // 7-bit level
  72.         put_bits(pb, 1, 0);
  73.         put_bits(pb, 1, last);
  74.         put_bits(pb, 6, run);
  75.  
  76.         put_sbits(pb, 7, slevel);
  77.     } else {
  78.         /* 11-bit level */
  79.         put_bits(pb, 1, 1);
  80.         put_bits(pb, 1, last);
  81.         put_bits(pb, 6, run);
  82.  
  83.         put_sbits(pb, 11, slevel);
  84.     }
  85. }
  86.  
  87. FF_MPV_GENERIC_CLASS(flv)
  88.  
  89. AVCodec ff_flv_encoder = {
  90.     .name           = "flv",
  91.     .long_name      = NULL_IF_CONFIG_SMALL("FLV / Sorenson Spark / Sorenson H.263 (Flash Video)"),
  92.     .type           = AVMEDIA_TYPE_VIDEO,
  93.     .id             = AV_CODEC_ID_FLV1,
  94.     .priv_data_size = sizeof(MpegEncContext),
  95.     .init           = ff_MPV_encode_init,
  96.     .encode2        = ff_MPV_encode_picture,
  97.     .close          = ff_MPV_encode_end,
  98.     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
  99.     .priv_class     = &flv_class,
  100. };
  101.