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