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
30 #include "mpegvideo.h"
34 extern uint8_t ff_h261_rl_table_store
[2][2*MAX_RUN
+ MAX_LEVEL
+ 3];
36 static void h261_encode_block(H261Context
* h
, DCTELEM
* block
,
39 int ff_h261_get_picture_format(int width
, int height
){
41 if (width
== 176 && height
== 144)
44 else if (width
== 352 && height
== 288)
51 void ff_h261_encode_picture_header(MpegEncContext
* s
, int picture_number
){
52 H261Context
* h
= (H261Context
*) s
;
55 align_put_bits(&s
->pb
);
57 /* Update the pointer to last GOB */
58 s
->ptr_lastgob
= pbBufPtr(&s
->pb
);
60 put_bits(&s
->pb
, 20, 0x10); /* PSC */
62 temp_ref
= s
->picture_number
* (int64_t)30000 * s
->avctx
->time_base
.num
/
63 (1001 * (int64_t)s
->avctx
->time_base
.den
); //FIXME maybe this should use a timestamp
64 put_bits(&s
->pb
, 5, temp_ref
& 0x1f); /* TemporalReference */
66 put_bits(&s
->pb
, 1, 0); /* split screen off */
67 put_bits(&s
->pb
, 1, 0); /* camera off */
68 put_bits(&s
->pb
, 1, 0); /* freeze picture release off */
70 format
= ff_h261_get_picture_format(s
->width
, s
->height
);
72 put_bits(&s
->pb
, 1, format
); /* 0 == QCIF, 1 == CIF */
74 put_bits(&s
->pb
, 1, 0); /* still image mode */
75 put_bits(&s
->pb
, 1, 0); /* reserved */
77 put_bits(&s
->pb
, 1, 0); /* no PEI */
86 * Encodes a group of blocks header.
88 static void h261_encode_gob_header(MpegEncContext
* s
, int mb_line
){
89 H261Context
* h
= (H261Context
*)s
;
90 if(ff_h261_get_picture_format(s
->width
, s
->height
) == 0){
91 h
->gob_number
+=2; // QCIF
94 h
->gob_number
++; // CIF
96 put_bits(&s
->pb
, 16, 1); /* GBSC */
97 put_bits(&s
->pb
, 4, h
->gob_number
); /* GN */
98 put_bits(&s
->pb
, 5, s
->qscale
); /* GQUANT */
99 put_bits(&s
->pb
, 1, 0); /* no GEI */
106 void ff_h261_reorder_mb_index(MpegEncContext
* s
){
107 int index
= s
->mb_x
+ s
->mb_y
*s
->mb_width
;
110 h261_encode_gob_header(s
,0);
112 /* for CIF the GOB's are fragmented in the middle of a scanline
113 that's why we need to adjust the x and y index of the macroblocks */
114 if(ff_h261_get_picture_format(s
->width
,s
->height
) == 1){ // CIF
115 s
->mb_x
= index
% 11 ; index
/= 11;
116 s
->mb_y
= index
% 3 ; index
/= 3;
117 s
->mb_x
+= 11*(index
% 2); index
/= 2;
120 ff_init_block_index(s
);
121 ff_update_block_index(s
);
125 static void h261_encode_motion(H261Context
* h
, int val
){
126 MpegEncContext
* const s
= &h
->s
;
130 put_bits(&s
->pb
,h261_mv_tab
[code
][1],h261_mv_tab
[code
][0]);
138 code
= sign
? -val
: val
;
139 put_bits(&s
->pb
,h261_mv_tab
[code
][1],h261_mv_tab
[code
][0]);
140 put_bits(&s
->pb
,1,sign
);
144 static inline int get_cbp(MpegEncContext
* s
,
145 DCTELEM block
[6][64])
149 for (i
= 0; i
< 6; i
++) {
150 if (s
->block_last_index
[i
] >= 0)
155 void ff_h261_encode_mb(MpegEncContext
* s
,
156 DCTELEM block
[6][64],
157 int motion_x
, int motion_y
)
159 H261Context
* h
= (H261Context
*)s
;
160 int mvd
, mv_diff_x
, mv_diff_y
, i
, cbp
;
161 cbp
= 63; // avoid warning
169 cbp
= get_cbp(s
, block
);
171 /* mvd indicates if this block is motion compensated */
172 mvd
= motion_x
| motion_y
;
174 if((cbp
| mvd
| s
->dquant
) == 0) {
175 /* skip macroblock */
183 /* MB is not skipped, encode MBA */
184 put_bits(&s
->pb
, h261_mba_bits
[(h
->current_mba
-h
->previous_mba
)-1], h261_mba_code
[(h
->current_mba
-h
->previous_mba
)-1]);
186 /* calculate MTYPE */
190 if(mvd
|| s
->loop_filter
)
196 assert(h
->mtype
> 1);
202 put_bits(&s
->pb
, h261_mtype_bits
[h
->mtype
], h261_mtype_code
[h
->mtype
]);
204 h
->mtype
= h261_mtype_map
[h
->mtype
];
206 if(IS_QUANT(h
->mtype
)){
207 ff_set_qscale(s
,s
->qscale
+s
->dquant
);
208 put_bits(&s
->pb
, 5, s
->qscale
);
211 if(IS_16X16(h
->mtype
)){
212 mv_diff_x
= (motion_x
>> 1) - h
->current_mv_x
;
213 mv_diff_y
= (motion_y
>> 1) - h
->current_mv_y
;
214 h
->current_mv_x
= (motion_x
>> 1);
215 h
->current_mv_y
= (motion_y
>> 1);
216 h261_encode_motion(h
,mv_diff_x
);
217 h261_encode_motion(h
,mv_diff_y
);
220 h
->previous_mba
= h
->current_mba
;
222 if(HAS_CBP(h
->mtype
)){
224 put_bits(&s
->pb
,h261_cbp_tab
[cbp
-1][1],h261_cbp_tab
[cbp
-1][0]);
227 /* encode each block */
228 h261_encode_block(h
, block
[i
], i
);
231 if ( ( h
->current_mba
== 11 ) || ( h
->current_mba
== 22 ) || ( h
->current_mba
== 33 ) || ( !IS_16X16 ( h
->mtype
) )){
237 void ff_h261_encode_init(MpegEncContext
*s
){
242 init_rl(&h261_rl_tcoeff
, ff_h261_rl_table_store
);
248 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
253 * encodes a 8x8 block.
254 * @param block the 8x8 block
255 * @param n block index (0-3 are luma, 4-5 are chroma)
257 static void h261_encode_block(H261Context
* h
, DCTELEM
* block
, int n
){
258 MpegEncContext
* const s
= &h
->s
;
259 int level
, run
, last
, i
, j
, last_index
, last_non_zero
, sign
, slevel
, code
;
262 rl
= &h261_rl_tcoeff
;
266 /* 255 cannot be represented, so we clamp */
271 /* 0 cannot be represented also */
272 else if (level
< 1) {
277 put_bits(&s
->pb
, 8, 0xff);
279 put_bits(&s
->pb
, 8, level
);
281 } else if((block
[0]==1 || block
[0] == -1) && (s
->block_last_index
[n
] > -1)){
283 put_bits(&s
->pb
,2,block
[0]>0 ? 2 : 3 );
290 last_index
= s
->block_last_index
[n
];
291 last_non_zero
= i
- 1;
292 for (; i
<= last_index
; i
++) {
293 j
= s
->intra_scantable
.permutated
[i
];
296 run
= i
- last_non_zero
- 1;
297 last
= (i
== last_index
);
304 code
= get_rl_index(rl
, 0 /*no last in H.261, EOB is used*/, run
, level
);
305 if(run
==0 && level
< 16)
307 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
309 put_bits(&s
->pb
, 6, run
);
311 assert(level
<= 127);
312 put_bits(&s
->pb
, 8, slevel
& 0xff);
314 put_bits(&s
->pb
, 1, sign
);
320 put_bits(&s
->pb
, rl
->table_vlc
[0][1], rl
->table_vlc
[0][0]);// END OF BLOCK
324 AVCodec h261_encoder
= {
332 .pix_fmts
= (enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},