FFmpeg
Loading...
Searching...
No Matches
h261enc.c
Go to the documentation of this file.
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
29#include "libavutil/avassert.h"
30#include "libavutil/thread.h"
31#include "avcodec.h"
32#include "codec_internal.h"
33#include "mpegutils.h"
34#include "mpegvideo.h"
35#include "h261.h"
36#include "h261enc.h"
37#include "mpegvideoenc.h"
38#include "put_bits.h"
39
40#define H261_MAX_RUN 26
41#define H261_MAX_LEVEL 15
42#define H261_ESC_LEN (6 + 6 + 8)
43#define MV_TAB_OFFSET 32
44
45static struct VLCLUT {
46 uint8_t len;
47 uint16_t code;
48} vlc_lut[H261_MAX_RUN + 1][32 /* 0..2 * H261_MAX_LEN are used */];
49
50// Not const despite never being initialized because doing so would
51// put it into .rodata instead of .bss and bloat the binary.
52// mv_penalty exists so that the motion estimation code can avoid branches.
53static uint8_t mv_penalty[MAX_FCODE + 1][MAX_DMV * 2 + 1];
54static uint8_t uni_h261_rl_len [64 * 128];
55static uint8_t uni_h261_rl_len_last[64 * 128];
56static uint8_t h261_mv_codes[64][2];
57
67
69{
70 H261EncContext *const h = (H261EncContext *)m;
71 MPVEncContext *const s = &h->s.s;
72 int temp_ref;
73
75
76 put_bits(&s->pb, 20, 0x10); /* PSC */
77
78 temp_ref = s->picture_number * 30000LL * s->c.avctx->time_base.num /
79 (1001LL * s->c.avctx->time_base.den); // FIXME maybe this should use a timestamp
80 put_sbits(&s->pb, 5, temp_ref); /* TemporalReference */
81
82 put_bits(&s->pb, 1, 0); /* split screen off */
83 put_bits(&s->pb, 1, 0); /* camera off */
84 put_bits(&s->pb, 1, s->c.pict_type == AV_PICTURE_TYPE_I); /* freeze picture release on/off */
85
86 put_bits(&s->pb, 1, h->format); /* 0 == QCIF, 1 == CIF */
87
88 put_bits(&s->pb, 1, 1); /* still image mode */
89 put_bits(&s->pb, 1, 1); /* reserved */
90
91 put_bits(&s->pb, 1, 0); /* no PEI */
92 h->gob_number = h->format - 1;
93 s->mb_skip_run = 0;
94
95 return 0;
96}
97
98/**
99 * Encode a group of blocks header.
100 */
101static void h261_encode_gob_header(MPVEncContext *const s, int mb_line)
102{
103 H261EncContext *const h = (H261EncContext *)s;
104 if (h->format == H261_QCIF) {
105 h->gob_number += 2; // QCIF
106 } else {
107 h->gob_number++; // CIF
108 }
109 put_bits(&s->pb, 16, 1); /* GBSC */
110 put_bits(&s->pb, 4, h->gob_number); /* GN */
111 put_bits(&s->pb, 5, s->c.qscale); /* GQUANT */
112 put_bits(&s->pb, 1, 0); /* no GEI */
113 s->mb_skip_run = 0;
114 s->c.last_mv[0][0][0] = 0;
115 s->c.last_mv[0][0][1] = 0;
116}
117
119{
120 const H261EncContext *const h = (H261EncContext*)s;
121 int index = s->c.mb_x + s->c.mb_y * s->c.mb_width;
122
123 if (index % 11 == 0) {
124 if (index % 33 == 0)
126 s->c.last_mv[0][0][0] = 0;
127 s->c.last_mv[0][0][1] = 0;
128 }
129
130 /* for CIF the GOB's are fragmented in the middle of a scanline
131 * that's why we need to adjust the x and y index of the macroblocks */
132 if (h->format == H261_CIF) {
133 s->c.mb_x = index % 11;
134 index /= 11;
135 s->c.mb_y = index % 3;
136 index /= 3;
137 s->c.mb_x += 11 * (index % 2);
138 index /= 2;
139 s->c.mb_y += 3 * index;
140
142 ff_update_block_index(&s->c, 8, 0, 1);
143 }
144}
145
151
152static inline int get_cbp(const int block_last_index[6])
153{
154 int i, cbp;
155 cbp = 0;
156 for (i = 0; i < 6; i++)
157 if (block_last_index[i] >= 0)
158 cbp |= 1 << (5 - i);
159 return cbp;
160}
161
162/**
163 * Encode an 8x8 block.
164 * @param block the 8x8 block
165 * @param n block index (0-3 are luma, 4-5 are chroma)
166 */
167static void h261_encode_block(H261EncContext *h, int16_t *block, int n)
168{
169 MPVEncContext *const s = &h->s.s;
170 int level, run, i, j, last_index, last_non_zero;
171
172 if (s->c.mb_intra) {
173 /* DC coef */
174 level = block[0];
175 /* 255 cannot be represented, so we clamp */
176 if (level > 254) {
177 level = 254;
178 block[0] = 254;
179 }
180 /* 0 cannot be represented also */
181 else if (level < 1) {
182 level = 1;
183 block[0] = 1;
184 }
185 if (level == 128)
186 put_bits(&s->pb, 8, 0xff);
187 else
188 put_bits(&s->pb, 8, level);
189 i = 1;
190 } else if ((block[0] == 1 || block[0] == -1) &&
191 (s->c.block_last_index[n] > -1)) {
192 // special case
193 put_bits(&s->pb, 2, block[0] > 0 ? 2 : 3);
194 i = 1;
195 } else {
196 i = 0;
197 }
198
199 /* AC coefs */
200 last_index = s->c.block_last_index[n];
201 last_non_zero = i - 1;
202 for (; i <= last_index; i++) {
203 j = s->c.intra_scantable.permutated[i];
204 level = block[j];
205 if (level) {
206 run = i - last_non_zero - 1;
207
208 if (run <= H261_MAX_RUN &&
209 (unsigned)(level + H261_MAX_LEVEL) <= 2 * H261_MAX_LEVEL &&
213 } else {
214 /* Escape */
215 put_bits(&s->pb, 6 + 6, (1 << 6) | run);
216 av_assert1(level != 0);
217 av_assert1(FFABS(level) <= 127);
218 put_sbits(&s->pb, 8, level);
219 }
220 last_non_zero = i;
221 }
222 }
223 if (last_index > -1)
224 put_bits(&s->pb, 2, 0x2); // EOB
225}
226
227static void h261_encode_mb(MPVEncContext *const s, int16_t block[6][64],
228 int motion_x, int motion_y)
229{
230 /* The following is only allowed because this encoder
231 * does not use slice threading. */
232 H261EncContext *const h = (H261EncContext *)s;
233 int mvd, mv_diff_x, mv_diff_y, i, cbp;
234 cbp = 63; // avoid warning
235 mvd = 0;
236
237 s->c.mtype = 0;
238
239 if (!s->c.mb_intra) {
240 /* compute cbp */
241 cbp = get_cbp(s->c.block_last_index);
242
243 /* mvd indicates if this block is motion compensated */
244 mvd = motion_x | motion_y;
245
246 if ((cbp | mvd) == 0) {
247 /* skip macroblock */
248 s->mb_skip_run++;
249 s->c.last_mv[0][0][0] = 0;
250 s->c.last_mv[0][0][1] = 0;
251 s->c.qscale -= s->dquant;
252 return;
253 }
254 }
255
256 /* MB is not skipped, encode MBA */
257 put_bits(&s->pb,
258 ff_h261_mba_bits[s->mb_skip_run],
259 ff_h261_mba_code[s->mb_skip_run]);
260 s->mb_skip_run = 0;
261
262 /* calculate MTYPE */
263 if (!s->c.mb_intra) {
264 s->c.mtype++;
265
266 if (mvd || s->loop_filter)
267 s->c.mtype += 3;
268 if (s->loop_filter)
269 s->c.mtype += 3;
270 if (cbp)
271 s->c.mtype++;
272 av_assert1(s->c.mtype > 1);
273 }
274
275 if (s->dquant && cbp) {
276 s->c.mtype++;
277 } else
278 s->c.qscale -= s->dquant;
279
280 put_bits(&s->pb,
281 ff_h261_mtype_bits[s->c.mtype],
282 ff_h261_mtype_code[s->c.mtype]);
283
284 s->c.mtype = ff_h261_mtype_map[s->c.mtype];
285
286 if (IS_QUANT(s->c.mtype)) {
287 ff_set_qscale(&s->c, s->c.qscale + s->dquant);
288 put_bits(&s->pb, 5, s->c.qscale);
289 }
290
291 if (IS_16X16(s->c.mtype)) {
292 mv_diff_x = (motion_x >> 1) - s->c.last_mv[0][0][0];
293 mv_diff_y = (motion_y >> 1) - s->c.last_mv[0][0][1];
294 s->c.last_mv[0][0][0] = (motion_x >> 1);
295 s->c.last_mv[0][0][1] = (motion_y >> 1);
296 h261_encode_motion(&s->pb, mv_diff_x);
297 h261_encode_motion(&s->pb, mv_diff_y);
298 }
299
300 if (HAS_CBP(s->c.mtype)) {
301 av_assert1(cbp > 0);
302 put_bits(&s->pb,
303 ff_h261_cbp_tab[cbp - 1][1],
304 ff_h261_cbp_tab[cbp - 1][0]);
305 }
306 for (i = 0; i < 6; i++)
307 /* encode each block */
309
310 if (!IS_16X16(s->c.mtype)) {
311 s->c.last_mv[0][0][0] = 0;
312 s->c.last_mv[0][0][1] = 0;
313 }
314}
315
317{
318 uint8_t (*const mv_codes)[2] = h261_mv_codes + MV_TAB_OFFSET;
320 memset(uni_h261_rl_len_last, H261_ESC_LEN + 2 /* EOB */, sizeof(uni_h261_rl_len_last));
321
322 // The following loop is over the ordinary elements, not EOB or escape.
323 for (size_t i = 1; i < FF_ARRAY_ELEMS(ff_h261_tcoeff_vlc) - 1; i++) {
324 unsigned run = ff_h261_tcoeff_run[i];
325 unsigned level = ff_h261_tcoeff_level[i];
326 unsigned len = ff_h261_tcoeff_vlc[i][1] + 1 /* sign */;
327 unsigned code = ff_h261_tcoeff_vlc[i][0];
328
329 vlc_lut[run][H261_MAX_LEVEL + level] = (struct VLCLUT){ len, code << 1 };
330 vlc_lut[run][H261_MAX_LEVEL - level] = (struct VLCLUT){ len, (code << 1) | 1 };
331
336 }
337
338 for (ptrdiff_t i = 1;; i++) {
339 // sign-one MV codes; diff -16..-1, 16..31
340 mv_codes[32 - i][0] = mv_codes[-i][0] = (ff_h261_mv_tab[i][0] << 1) | 1 /* sign */;
341 mv_codes[32 - i][1] = mv_codes[-i][1] = ff_h261_mv_tab[i][1] + 1;
342 if (i == 16)
343 break;
344 // sign-zero MV codes: diff -31..-17, 1..15
345 mv_codes[i][0] = mv_codes[i - 32][0] = ff_h261_mv_tab[i][0] << 1;
346 mv_codes[i][1] = mv_codes[i - 32][1] = ff_h261_mv_tab[i][1] + 1;
347 }
348 // MV code for difference zero; has no sign
349 mv_codes[0][0] = 1;
350 mv_codes[0][1] = 1;
351}
352
354{
355 static AVOnce init_static_once = AV_ONCE_INIT;
356 H261EncContext *const h = avctx->priv_data;
357 MPVEncContext *const s = &h->s.s;
358
359 if (avctx->width == 176 && avctx->height == 144) {
360 h->format = H261_QCIF;
361 } else if (avctx->width == 352 && avctx->height == 288) {
362 h->format = H261_CIF;
363 } else {
364 av_log(avctx, AV_LOG_ERROR,
365 "The specified picture size of %dx%d is not valid for the "
366 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
367 avctx->width, avctx->height);
368 return AVERROR(EINVAL);
369 }
370 h->s.encode_picture_header = h261_encode_picture_header;
371 s->encode_mb = h261_encode_mb;
372
373 s->min_qcoeff = -127;
374 s->max_qcoeff = 127;
375 s->ac_esc_length = H261_ESC_LEN;
376
377 s->me.mv_penalty = mv_penalty;
378
379 s->intra_ac_vlc_length = s->inter_ac_vlc_length = uni_h261_rl_len;
380 s->intra_ac_vlc_last_length = s->inter_ac_vlc_last_length = uni_h261_rl_len_last;
381 ff_thread_once(&init_static_once, h261_encode_init_static);
382
383 return ff_mpv_encode_init(avctx);
384}
385
387 .p.name = "h261",
388 CODEC_LONG_NAME("H.261"),
389 .p.type = AVMEDIA_TYPE_VIDEO,
390 .p.id = AV_CODEC_ID_H261,
391 .p.priv_class = &ff_mpv_enc_class,
393 .priv_data_size = sizeof(H261EncContext),
396 .close = ff_mpv_encode_end,
397 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
399 .color_ranges = AVCOL_RANGE_MPEG,
400};
static double val(void *priv, double ch)
Definition aeval.c:77
static const char *const format[]
Definition af_aiir.c:444
const FFCodec ff_h261_encoder
Definition h261enc.c:386
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define CODEC_PIXFMTS(...)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
static int16_t block[64]
Definition dct.c:125
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition codec.h:147
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
@ AV_CODEC_ID_H261
Definition codec_id.h:53
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
int index
Definition gxfenc.c:90
H.261 codec.
const uint16_t ff_h261_mtype_map[10]
Definition h261data.c:75
const uint8_t ff_h261_mv_tab[17][2]
Definition h261data.c:89
const uint8_t ff_h261_mtype_bits[10]
Definition h261data.c:69
const uint8_t ff_h261_mtype_code[10]
Definition h261data.c:63
const int8_t ff_h261_tcoeff_run[64]
Definition h261data.c:138
const int8_t ff_h261_tcoeff_level[64]
Definition h261data.c:127
const uint8_t ff_h261_mba_code[35]
Definition h261data.c:34
const uint8_t ff_h261_cbp_tab[63][2]
Definition h261data.c:95
const uint16_t ff_h261_tcoeff_vlc[65][2]
Definition h261data.c:107
const uint8_t ff_h261_mba_bits[35]
Definition h261data.c:48
static av_cold void h261_encode_init_static(void)
Definition h261enc.c:316
#define H261_MAX_RUN
Definition h261enc.c:40
static int h261_encode_picture_header(MPVMainEncContext *const m)
Definition h261enc.c:68
static uint8_t mv_penalty[MAX_FCODE+1][MAX_DMV *2+1]
Definition h261enc.c:53
static void h261_encode_mb(MPVEncContext *const s, int16_t block[6][64], int motion_x, int motion_y)
Definition h261enc.c:227
static void h261_encode_block(H261EncContext *h, int16_t *block, int n)
Encode an 8x8 block.
Definition h261enc.c:167
static uint8_t h261_mv_codes[64][2]
Definition h261enc.c:56
static struct VLCLUT vlc_lut[H261_MAX_RUN+1][32/*0..2 *H261_MAX_LEN are used */]
static void h261_encode_motion(PutBitContext *pb, int val)
Definition h261enc.c:146
static int get_cbp(const int block_last_index[6])
Definition h261enc.c:152
#define H261_ESC_LEN
Definition h261enc.c:42
#define MV_TAB_OFFSET
Definition h261enc.c:43
static uint8_t uni_h261_rl_len_last[64 *128]
Definition h261enc.c:55
static uint8_t uni_h261_rl_len[64 *128]
Definition h261enc.c:54
#define H261_MAX_LEVEL
Definition h261enc.c:41
void ff_h261_reorder_mb_index(MPVEncContext *const s)
Definition h261enc.c:118
static av_cold int h261_encode_init(AVCodecContext *avctx)
Definition h261enc.c:353
static void h261_encode_gob_header(MPVEncContext *const s, int mb_line)
Encode a group of blocks header.
Definition h261enc.c:101
H.261 encoder header.
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition j2kenc.c:154
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
#define MAX_DMV
Definition motion_est.h:39
#define HAS_CBP(a)
Definition mpegutils.h:87
#define IS_16X16(a)
Definition mpegutils.h:80
#define IS_QUANT(a)
Definition mpegutils.h:85
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
Definition mpegvideo.c:505
void ff_init_block_index(MpegEncContext *s)
Definition mpegvideo.c:472
mpegvideo header.
static void ff_update_block_index(MpegEncContext *s, int bits_per_raw_sample, int lowres, int chroma_x_shift)
Definition mpegvideo.h:335
const AVClass ff_mpv_enc_class
av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet)
av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
mpegvideo header.
#define UNI_AC_ENC_INDEX(run, level)
#define MAX_FCODE
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
bitstream writer API
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition put_bits.h:291
static void put_bits_assume_flushed(const PutBitContext *s)
Inform the compiler that a PutBitContext is flushed (i.e.
Definition put_bits.h:82
#define FF_ARRAY_ELEMS(a)
const uint8_t * code
Definition spdifenc.c:433
main external API structure.
Definition avcodec.h:443
int width
picture width / height.
Definition avcodec.h:604
void * priv_data
Definition avcodec.h:470
MPVMainEncContext s
Definition h261enc.c:59
uint8_t len
Definition h261enc.c:46
uint16_t code
Definition h261enc.c:47
uint8_t run
Definition svq3.c:207
uint8_t level
Definition svq3.c:208
#define av_log(a,...)
int len