3 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
4 * Copyright (c) 2004 Maarten Daniels
6 * This file is part of FFmpeg.
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.
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.
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
28 #include "libavutil/attributes.h"
29 #include "libavutil/avassert.h"
31 #include "mpegutils.h"
32 #include "mpegvideo.h"
36 static uint8_t uni_h261_rl_len
[64*64*2*2];
37 #define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
39 int ff_h261_get_picture_format(int width
, int height
)
42 if (width
== 176 && height
== 144)
45 else if (width
== 352 && height
== 288)
52 void ff_h261_encode_picture_header(MpegEncContext
*s
, int picture_number
)
54 H261Context
*h
= (H261Context
*)s
;
57 avpriv_align_put_bits(&s
->pb
);
59 /* Update the pointer to last GOB */
60 s
->ptr_lastgob
= put_bits_ptr(&s
->pb
);
62 put_bits(&s
->pb
, 20, 0x10); /* PSC */
64 temp_ref
= s
->picture_number
* (int64_t)30000 * s
->avctx
->time_base
.num
/
65 (1001 * (int64_t)s
->avctx
->time_base
.den
); // FIXME maybe this should use a timestamp
66 put_sbits(&s
->pb
, 5, temp_ref
); /* TemporalReference */
68 put_bits(&s
->pb
, 1, 0); /* split screen off */
69 put_bits(&s
->pb
, 1, 0); /* camera off */
70 put_bits(&s
->pb
, 1, 0); /* freeze picture release off */
72 format
= ff_h261_get_picture_format(s
->width
, s
->height
);
74 put_bits(&s
->pb
, 1, format
); /* 0 == QCIF, 1 == CIF */
76 put_bits(&s
->pb
, 1, 0); /* still image mode */
77 put_bits(&s
->pb
, 1, 0); /* reserved */
79 put_bits(&s
->pb
, 1, 0); /* no PEI */
88 * Encode a group of blocks header.
90 static void h261_encode_gob_header(MpegEncContext
*s
, int mb_line
)
92 H261Context
*h
= (H261Context
*)s
;
93 if (ff_h261_get_picture_format(s
->width
, s
->height
) == 0) {
94 h
->gob_number
+= 2; // QCIF
96 h
->gob_number
++; // CIF
98 put_bits(&s
->pb
, 16, 1); /* GBSC */
99 put_bits(&s
->pb
, 4, h
->gob_number
); /* GN */
100 put_bits(&s
->pb
, 5, s
->qscale
); /* GQUANT */
101 put_bits(&s
->pb
, 1, 0); /* no GEI */
103 s
->last_mv
[0][0][0] = 0;
104 s
->last_mv
[0][0][1] = 0;
107 void ff_h261_reorder_mb_index(MpegEncContext
*s
)
109 int index
= s
->mb_x
+ s
->mb_y
* s
->mb_width
;
111 if (index
% 11 == 0) {
113 h261_encode_gob_header(s
, 0);
114 s
->last_mv
[0][0][0] = 0;
115 s
->last_mv
[0][0][1] = 0;
118 /* for CIF the GOB's are fragmented in the middle of a scanline
119 * that's why we need to adjust the x and y index of the macroblocks */
120 if (ff_h261_get_picture_format(s
->width
, s
->height
) == 1) { // CIF
121 s
->mb_x
= index
% 11;
125 s
->mb_x
+= 11 * (index
% 2);
127 s
->mb_y
+= 3 * index
;
129 ff_init_block_index(s
);
130 ff_update_block_index(s
);
134 static void h261_encode_motion(H261Context
*h
, int val
)
136 MpegEncContext
*const s
= &h
->s
;
140 put_bits(&s
->pb
, ff_h261_mv_tab
[code
][1], ff_h261_mv_tab
[code
][0]);
147 code
= sign
? -val
: val
;
148 put_bits(&s
->pb
, ff_h261_mv_tab
[code
][1], ff_h261_mv_tab
[code
][0]);
149 put_bits(&s
->pb
, 1, sign
);
153 static inline int get_cbp(MpegEncContext
*s
, int16_t block
[6][64])
157 for (i
= 0; i
< 6; i
++)
158 if (s
->block_last_index
[i
] >= 0)
164 * Encode an 8x8 block.
165 * @param block the 8x8 block
166 * @param n block index (0-3 are luma, 4-5 are chroma)
168 static void h261_encode_block(H261Context
*h
, int16_t *block
, int n
)
170 MpegEncContext
*const s
= &h
->s
;
171 int level
, run
, i
, j
, last_index
, last_non_zero
, sign
, slevel
, code
;
174 rl
= &ff_h261_rl_tcoeff
;
178 /* 255 cannot be represented, so we clamp */
183 /* 0 cannot be represented also */
184 else if (level
< 1) {
189 put_bits(&s
->pb
, 8, 0xff);
191 put_bits(&s
->pb
, 8, level
);
193 } else if ((block
[0] == 1 || block
[0] == -1) &&
194 (s
->block_last_index
[n
] > -1)) {
196 put_bits(&s
->pb
, 2, block
[0] > 0 ? 2 : 3);
203 last_index
= s
->block_last_index
[n
];
204 last_non_zero
= i
- 1;
205 for (; i
<= last_index
; i
++) {
206 j
= s
->intra_scantable
.permutated
[i
];
209 run
= i
- last_non_zero
- 1;
216 code
= get_rl_index(rl
, 0 /*no last in H.261, EOB is used*/,
218 if (run
== 0 && level
< 16)
220 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
222 put_bits(&s
->pb
, 6, run
);
223 av_assert1(slevel
!= 0);
224 av_assert1(level
<= 127);
225 put_sbits(&s
->pb
, 8, slevel
);
227 put_bits(&s
->pb
, 1, sign
);
233 put_bits(&s
->pb
, rl
->table_vlc
[0][1], rl
->table_vlc
[0][0]); // EOB
236 void ff_h261_encode_mb(MpegEncContext
*s
, int16_t block
[6][64],
237 int motion_x
, int motion_y
)
239 H261Context
*h
= (H261Context
*)s
;
240 int mvd
, mv_diff_x
, mv_diff_y
, i
, cbp
;
241 cbp
= 63; // avoid warning
248 cbp
= get_cbp(s
, block
);
250 /* mvd indicates if this block is motion compensated */
251 mvd
= motion_x
| motion_y
;
253 if ((cbp
| mvd
| s
->dquant
) == 0) {
254 /* skip macroblock */
257 s
->last_mv
[0][0][0] = 0;
258 s
->last_mv
[0][0][1] = 0;
263 /* MB is not skipped, encode MBA */
265 ff_h261_mba_bits
[s
->mb_skip_run
],
266 ff_h261_mba_code
[s
->mb_skip_run
]);
269 /* calculate MTYPE */
273 if (mvd
|| s
->loop_filter
)
277 if (cbp
|| s
->dquant
)
279 av_assert1(h
->mtype
> 1);
286 ff_h261_mtype_bits
[h
->mtype
],
287 ff_h261_mtype_code
[h
->mtype
]);
289 h
->mtype
= ff_h261_mtype_map
[h
->mtype
];
291 if (IS_QUANT(h
->mtype
)) {
292 ff_set_qscale(s
, s
->qscale
+ s
->dquant
);
293 put_bits(&s
->pb
, 5, s
->qscale
);
296 if (IS_16X16(h
->mtype
)) {
297 mv_diff_x
= (motion_x
>> 1) - s
->last_mv
[0][0][0];
298 mv_diff_y
= (motion_y
>> 1) - s
->last_mv
[0][0][1];
299 s
->last_mv
[0][0][0] = (motion_x
>> 1);
300 s
->last_mv
[0][0][1] = (motion_y
>> 1);
301 h261_encode_motion(h
, mv_diff_x
);
302 h261_encode_motion(h
, mv_diff_y
);
305 if (HAS_CBP(h
->mtype
)) {
308 ff_h261_cbp_tab
[cbp
- 1][1],
309 ff_h261_cbp_tab
[cbp
- 1][0]);
311 for (i
= 0; i
< 6; i
++)
312 /* encode each block */
313 h261_encode_block(h
, block
[i
], i
);
315 if (!IS_16X16(h
->mtype
)) {
316 s
->last_mv
[0][0][0] = 0;
317 s
->last_mv
[0][0][1] = 0;
321 static av_cold
void init_uni_h261_rl_tab(RLTable
*rl
, uint32_t *bits_tab
,
324 int slevel
, run
, last
;
326 av_assert0(MAX_LEVEL
>= 64);
327 av_assert0(MAX_RUN
>= 63);
329 for(slevel
=-64; slevel
<64; slevel
++){
330 if(slevel
==0) continue;
331 for(run
=0; run
<64; run
++){
332 for(last
=0; last
<=1; last
++){
333 const int index
= UNI_ENC_INDEX(last
, run
, slevel
+64);
334 int level
= slevel
< 0 ? -slevel
: slevel
;
340 code
= get_rl_index(rl
, 0, run
, level
);
341 len
= rl
->table_vlc
[code
][1] + 1;
345 if(code
!=rl
->n
&& len
< len_tab
[index
]){
346 len_tab
[index
]= len
;
349 len
= rl
->table_vlc
[rl
->n
][1];
353 if(len
< len_tab
[index
]){
354 len_tab
[index
]= len
;
361 av_cold
void ff_h261_encode_init(MpegEncContext
*s
)
363 ff_h261_common_init();
365 s
->min_qcoeff
= -127;
367 s
->y_dc_scale_table
=
368 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
369 s
->ac_esc_length
= 6+6+8;
371 init_uni_h261_rl_tab(&ff_h261_rl_tcoeff
, NULL
, uni_h261_rl_len
);
373 s
->intra_ac_vlc_length
= s
->inter_ac_vlc_length
= uni_h261_rl_len
;
374 s
->intra_ac_vlc_last_length
= s
->inter_ac_vlc_last_length
= uni_h261_rl_len
+ 128*64;
377 FF_MPV_GENERIC_CLASS(h261
)
379 AVCodec ff_h261_encoder
= {
381 .long_name
= NULL_IF_CONFIG_SMALL("H.261"),
382 .type
= AVMEDIA_TYPE_VIDEO
,
383 .id
= AV_CODEC_ID_H261
,
384 .priv_data_size
= sizeof(H261Context
),
385 .init
= ff_mpv_encode_init
,
386 .encode2
= ff_mpv_encode_picture
,
387 .close
= ff_mpv_encode_end
,
388 .pix_fmts
= (const enum AVPixelFormat
[]) { AV_PIX_FMT_YUV420P
,
390 .priv_class
= &h261_class
,