1 /*
2 * H.261 encoder
3 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
4 * Copyright (c) 2004 Maarten Daniels
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file
25 * H.261 encoder.
26 */
27
36
38 #define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
39
41 {
42 // QCIF
43 if (width == 176 && height == 144)
44 return 0;
45 // CIF
46 else if (width == 352 && height == 288)
47 return 1;
48 // ERROR
49 else
51 }
52
54 {
57
59
60 /* Update the pointer to last GOB */
62
64
67 put_sbits(&s->
pb, 5, temp_ref);
/* TemporalReference */
68
72
74
75 put_bits(&s->
pb, 1, format);
/* 0 == QCIF, 1 == CIF */
76
79
81 if (format == 0)
83 else
86 }
87
88 /**
89 * Encode a group of blocks header.
90 */
92 {
96 } else {
98 }
106 }
107
109 {
111
112 if (index % 11 == 0) {
113 if (index % 33 == 0)
117 }
118
119 /* for CIF the GOB's are fragmented in the middle of a scanline
120 * that's why we need to adjust the x and y index of the macroblocks */
122 s->
mb_x = index % 11;
123 index /= 11;
125 index /= 3;
126 s->
mb_x += 11 * (index % 2);
127 index /= 2;
129
132 }
133 }
134
136 {
138 int sign, code;
139 if (val == 0) {
140 code = 0;
142 } else {
143 if (val > 15)
144 val -= 32;
145 if (val < -16)
146 val += 32;
147 sign = val < 0;
148 code = sign ? -val :
val;
151 }
152 }
153
155 {
156 int i, cbp;
157 cbp = 0;
158 for (i = 0; i < 6; i++)
160 cbp |= 1 << (5 - i);
161 return cbp;
162 }
163
164 /**
165 * Encode an 8x8 block.
166 * @param block the 8x8 block
167 * @param n block index (0-3 are luma, 4-5 are chroma)
168 */
170 {
172 int level,
run, i, j, last_index, last_non_zero, sign, slevel, code;
174
177 /* DC coef */
178 level = block[0];
179 /* 255 cannot be represented, so we clamp */
180 if (level > 254) {
181 level = 254;
182 block[0] = 254;
183 }
184 /* 0 cannot be represented also */
185 else if (level < 1) {
186 level = 1;
187 block[0] = 1;
188 }
189 if (level == 128)
191 else
193 i = 1;
194 } else if ((block[0] == 1 || block[0] == -1) &&
196 // special case
198 i = 1;
199 } else {
200 i = 0;
201 }
202
203 /* AC coefs */
205 last_non_zero = i - 1;
206 for (; i <= last_index; i++) {
208 level = block[j];
209 if (level) {
210 run = i - last_non_zero - 1;
211 sign = 0;
213 if (level < 0) {
214 sign = 1;
216 }
217 code =
get_rl_index(rl, 0
/*no last in H.261, EOB is used*/,
218 run, level);
219 if (run == 0 && level < 16)
220 code += 1;
227 } else {
229 }
230 last_non_zero = i;
231 }
232 }
233 if (last_index > -1)
235 }
236
238 int motion_x, int motion_y)
239 {
241 int mvd, mv_diff_x, mv_diff_y, i, cbp;
242 cbp = 63; // avoid warning
243 mvd = 0;
244
246
248 /* compute cbp */
250
251 /* mvd indicates if this block is motion compensated */
252 mvd = motion_x | motion_y;
253
254 if ((cbp | mvd) == 0) {
255 /* skip macroblock */
261 return;
262 }
263 }
264
265 /* MB is not skipped, encode MBA */
270
271 /* calculate MTYPE */
274
279 if (cbp)
282 }
283
286 } else
288
292
294
298 }
299
301 mv_diff_x = (motion_x >> 1) - s->
last_mv[0][0][0];
302 mv_diff_y = (motion_y >> 1) - s->
last_mv[0][0][1];
303 s->
last_mv[0][0][0] = (motion_x >> 1);
304 s->
last_mv[0][0][1] = (motion_y >> 1);
307 }
308
314 }
315 for (i = 0; i < 6; i++)
316 /* encode each block */
318
322 }
323 }
324
327 {
328 int slevel,
run, last;
329
332
333 for(slevel=-64; slevel<64; slevel++){
334 if(slevel==0) continue;
335 for(run=0; run<64; run++){
336 for(last=0; last<=1; last++){
338 int level= slevel < 0 ? -slevel : slevel;
340
342
343 /* ESC0 */
346 if(last)
347 len += 2;
348
349 if(code!=rl->
n && len < len_tab[index]){
351 }
352 /* ESC */
354 if(last)
355 len += 2;
356
357 if(len < len_tab[index]){
359 }
360 }
361 }
362 }
363 }
364
366 {
368
374
376
379 }
380
386 };
387
400 };
const char const char void * val
void ff_init_block_index(MpegEncContext *s)
#define UNI_ENC_INDEX(last, run, level)
static const char * format[]
const uint8_t * y_dc_scale_table
qscale -> y_dc_scale table
int last_mv[2][2][2]
last MV, used for MV prediction in MPEG-1 & B-frame MPEG-4
static void put_sbits(PutBitContext *pb, int n, int32_t value)
void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
#define LIBAVUTIL_VERSION_INT
static av_cold int init(AVCodecContext *avctx)
const uint8_t ff_h261_mba_bits[35]
const char * av_default_item_name(void *ptr)
Return the context name.
void avpriv_align_put_bits(PutBitContext *s)
Pad the bitstream with zeros up to the next byte boundary.
int min_qcoeff
minimum encodable coefficient
void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
uint8_t * intra_ac_vlc_length
const uint8_t ff_h261_mba_code[35]
Macro definitions for various function/variable attributes.
const uint8_t ff_h261_cbp_tab[63][2]
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
const AVOption ff_mpv_generic_options[]
const uint8_t ff_mpeg1_dc_scale_table[128]
static void h261_encode_gob_header(MpegEncContext *s, int mb_line)
Encode a group of blocks header.
int max_qcoeff
maximum encodable coefficient
int dquant
qscale difference to prev qscale
static void ff_update_block_index(MpegEncContext *s)
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
static void h261_encode_block(H261Context *h, int16_t *block, int n)
Encode an 8x8 block.
av_cold void ff_h261_common_init(void)
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
static const AVClass h261_class
uint8_t * inter_ac_vlc_last_length
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
uint8_t * intra_ac_vlc_last_length
int n
number of entries of table_vlc minus 1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
const uint16_t(* table_vlc)[2]
int block_last_index[12]
last non zero coefficient in block
const uint8_t ff_h261_mtype_code[10]
const uint8_t ff_h261_mtype_bits[10]
int ac_esc_length
num of bits needed to encode the longest esc
const uint8_t ff_h261_mv_tab[17][2]
const int ff_h261_mtype_map[10]
Libavcodec external API header.
void ff_h261_reorder_mb_index(MpegEncContext *s)
ScanTable intra_scantable
int height
picture size. must be a multiple of 16
int ff_h261_get_picture_format(int width, int height)
int ff_mpv_encode_init(AVCodecContext *avctx)
uint8_t * inter_ac_vlc_length
Describe the class of an AVClass context structure.
static int get_cbp(MpegEncContext *s, int16_t block[6][64])
static void h261_encode_motion(H261Context *h, int val)
RLTable ff_h261_rl_tcoeff
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
static enum AVPixelFormat pix_fmts[]
const uint8_t * c_dc_scale_table
qscale -> c_dc_scale table
struct AVCodecContext * avctx
PutBitContext pb
bit output
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
int ff_mpv_encode_end(AVCodecContext *avctx)
static int get_rl_index(const RLTable *rl, int last, int run, int level)
static uint8_t uni_h261_rl_len[64 *64 *2 *2]
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
static av_cold void init_uni_h261_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab)
av_cold void ff_h261_encode_init(MpegEncContext *s)
AVPixelFormat
Pixel format.