1 /*
2 * ITU H263 bitstream decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * H263+ support.
5 * Copyright (c) 2001 Juan J. Sierralta P
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
7 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25 /**
26 * @file
27 * h263 decoder.
28 */
29
30 #define UNCHECKED_BITSTREAM_READER 1
32
46
47 // The defines below define the number of bits that are read at once for
48 // reading vlc values. Changing these may improve speed and data cache needs
49 // be aware though that decreasing them may need the number of stages that is
50 // passed to get_vlc* to be increased.
52 #define H263_MBTYPE_B_VLC_BITS 6
53 #define CBPC_B_VLC_BITS 3
54
68 0, //stuffing
71 };
72
88 );
89 }
90 }
91
92 /***********************************************/
93 /* decoding */
94
101
102 /* init vlcs */
103
104 /* XXX: find a better solution to handle static init */
106 {
107 static volatile int done = 0;
108
109 if (!done) {
132 done = 1;
133 }
134 }
135
137 {
138 int i, mb_pos;
139
140 for(i=0; i<6; i++){
142 }
146
147 return mb_pos;
148 }
149
150 /**
151 * Decode the group of blocks header or slice header.
152 * @return <0 if an error occurred
153 */
155 {
156 unsigned int val, gob_number;
157 int left;
158
159 /* Check for GOB Start Code */
161 if(val)
162 return -1;
163
164 /* We have a GBSC probably with GSTUFF */
167 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
168 for(;left>13; left--){
169 if(
get_bits1(&s->
gb))
break;
/* Seek the '1' bit */
170 }
171 if(left<=13)
172 return -1;
173
176 return -1;
177
179
182 return -1;
183
186 return -1;
188 }else{
194 }
195
197 return -1;
198
200 return -1;
201
202 return 0;
203 }
204
205 /**
206 * Decode the group of blocks / video packet header.
207 * @return bit position of the resync_marker, or <0 if none was found
208 */
211
215 }
216
221 else
223 if(ret>=0)
224 return pos;
225 }
226 //OK, it's not where it is supposed to be ...
230
231 for(;left>16+1+5+5; left-=8){
234
238 else
240 if(ret>=0)
241 return pos;
242
244 }
246 }
247
248 return -1;
249 }
250
252 {
255
256 if (code == 0)
258 if (code < 0)
259 return 0xffff;
260
262 shift = f_code - 1;
263 val = code;
264 if (shift) {
265 val = (val - 1) << shift;
267 val++;
268 }
269 if (sign)
272
273 /* modulo decoding */
276 } else {
277 /* horrible h263 long vector mode */
278 if (pred < -31 && val < -63)
279 val += 64;
280 if (pred > 32 && val > 63)
281 val -= 64;
282
283 }
285 }
286
287
288 /* Decode RVLC of H.263+ UMV */
290 {
291 int code = 0, sign;
292
295
297
299 {
300 code <<= 1;
302 }
303 sign = code & 1;
304 code >>= 1;
305
306 code = (sign) ? (pred - code) : (pred + code);
308 return code;
309
310 }
311
312 /**
313 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
314 */
317
318 int cbpc, i, pred_x, pred_y, mx, my;
319 int16_t *mot_val;
322
323 for(i=0; i<4; i++)
325 for(i=4; i<6; i++)
328
330
331 do{
333 /* skip mb */
335 mot_val[0 ]= mot_val[2 ]=
337 mot_val[1 ]= mot_val[3 ]=
339
342 }
344 }while(cbpc == 20);
345
346 if(cbpc & 4){
348 }else{
350 if (cbpc & 8) {
354 }else
356 }
357
358 if ((cbpc & 16) == 0) {
360 /* 16x16 motion prediction */
364 else
366
369 else
371
372 mot_val[0 ]= mot_val[2 ]=
374 mot_val[1 ]= mot_val[3 ]=
376 } else {
378 for(i=0;i<4;i++) {
382 else
384
387 else
389 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
391 mot_val[0] = mx;
392 mot_val[1] = my;
393 }
394 }
395 }
397
398 for(i=0; i<4; i++)
400 for(i=4; i<6; i++)
403
405 }
406
408 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
409
413 else
415 }else
418 }
419
422 {
427
431 i = 0;
435 else
437 }
439 /* DC coef */
443 component = (n <= 3 ? 0 : n - 4 + 1);
447 if (diff == 0xffff)
448 return -1;
450 level = level & 0xff; /* handle wrap round */
452 } else {
454 }
455 } else {
457 if (level == 255)
458 level = 128;
459 }
460 }else{
462 if((level&0x7F) == 0){
465 return -1;
466 }
467 if (level == 255)
468 level = 128;
469 }
471 i = 1;
472 } else {
473 i = 0;
474 }
475 if (!coded) {
477 goto not_coded;
479 return 0;
480 }
481 retry:
482 {
484 i--; // offset by -1 to allow direct indexing of scan_table
485 for(;;) {
488 if (run == 66) {
489 if (level){
492 return -1;
493 }
494 /* escape */
495 if (CONFIG_FLV_DECODER && s->
h263_flv > 1) {
499 if (is11) {
504 } else {
508 }
509 } else {
514 if(level == -128){
517 /* XXX: should patch encoder too */
520 }else{
525 }
526 }
527 }
528 } else {
532 }
534 if (i >= 64){
536 // redo update without last flag, revert -1 offset
537 i = i - run + ((run-1)&63) + 1;
538 if (i < 64) {
539 // only last marker, no overrun
540 block[scan_table[i]] =
level;
541 break;
542 }
544 //Looks like a hack but no, it's the way it is supposed to work ...
546 i = 0;
549 goto retry;
550 }
552 return -1;
553 }
554 j = scan_table[i];
556 }
557 }
558 not_coded:
561 i = 63;
562 }
564 return 0;
565 }
566
568 {
570 int i, mbi;
571 int bli[6];
572
573 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
574 * but real value should be restored in order to be used later (in OBMC condition)
575 */
579 for (i = 0; i < 6; i++) {
581 return -1;
582 cbp+=cbp;
583 }
586 return 0;
587 }
588
590 {
592
593 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
595 if (pb_frame == 2 && c)
597 } else { // h.263 Annex M improved PB-frame
599 c = mv & 1;
600 mv = !!(mv & 2);
601 }
602 if(c)
605 }
606
608 int16_t
block[6][64])
609 {
610 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
611 int16_t *mot_val;
613 int cbpb = 0, pb_mv_count = 0;
614
616
618 do{
620 /* skip mb */
622 for(i=0;i<6;i++)
631 }
633 if (cbpc < 0){
635 return -1;
636 }
637 }while(cbpc == 20);
638
640
641 dquant = cbpc & 8;
644
648
650 cbpy ^= 0xF;
651
652 cbp = (cbpc & 3) | (cbpy << 2);
653 if (dquant) {
655 }
656
658 if ((cbpc & 16) == 0) {
660 /* 16x16 motion prediction */
665 else
667
668 if (mx >= 0xffff)
669 return -1;
670
673 else
675
676 if (my >= 0xffff)
677 return -1;
680
681 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
683 } else {
686 for(i=0;i<4;i++) {
690 else
692 if (mx >= 0xffff)
693 return -1;
694
697 else
699 if (my >= 0xffff)
700 return -1;
703 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
705 mot_val[0] = mx;
706 mot_val[1] = my;
707 }
708 }
710 int mb_type;
714 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
715
716 //FIXME ugly
717 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*
stride]= mot_val0[2+2*
stride]=
718 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*
stride]= mot_val0[3+2*
stride]=
719 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*
stride]= mot_val1[2+2*
stride]=
720 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*
stride]= mot_val1[3+2*
stride]= 0;
721
722 do{
724 if (mb_type < 0){
726 return -1;
727 }
728
730 }while(!mb_type);
731
738 goto intra;
739 }
740
742
743 if (cbpy < 0){
745 return -1;
746 }
747
749 cbpy ^= 0xF;
750
751 cbp = (cbpc & 3) | (cbpy << 2);
752 }else
753 cbp=0;
754
756
759 }
760
764 }else{
767 //FIXME UMV
768
772
775
778 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*
stride]= mot_val[2+2*
stride]= mx;
779 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*
stride]= mot_val[3+2*
stride]= my;
780 }
781
785
788
791 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*
stride]= mot_val[2+2*
stride]= mx;
792 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*
stride]= mot_val[3+2*
stride]= my;
793 }
794 }
795
797 } else { /* I-Frame */
798 do{
800 if (cbpc < 0){
802 return -1;
803 }
804 }while(cbpc == 8);
805
807
808 dquant = cbpc & 4;
810 intra:
816
818 }
819 }else
821
825 if(cbpy<0){
827 return -1;
828 }
829 cbp = (cbpc & 3) | (cbpy << 2);
830 if (dquant) {
832 }
833
835 }
836
837 while(pb_mv_count--){
840 }
841
842 /* decode each block */
843 for (i = 0; i < 6; i++) {
845 return -1;
846 cbp+=cbp;
847 }
848
850 return -1;
854 }
856
857 /* per-MB end of slice check */
858 {
860
863 }
864
865 if(v==0)
867 }
868
870 }
871
872 /* most is hardcoded. should extend to handle all h263 streams */
874 {
876 uint32_t startcode;
877
879
882 }
883
885
887 startcode = ((startcode << 8) |
get_bits(&s->
gb, 8)) & 0x003FFFFF;
888
889 if(startcode == 0x20)
890 break;
891 }
892
893 if (startcode != 0x20) {
895 return -1;
896 }
897 /* temporal reference */
898 i =
get_bits(&s->
gb, 8);
/* picture timestamp */
900 i+= 256;
902
903 /* PTYPE starts here */
905 return -1;
906 }
909 return -1; /* h263 id */
910 }
914
916 /*
917 0 forbidden
918 1 sub-QCIF
919 10 QCIF
920 7 extended PTYPE (PLUSPTYPE)
921 */
922
923 if (format != 7 && format != 6) {
925 /* H.263v1 */
928 if (!width)
929 return -1;
930
932
934
937 return -1; /* SAC: off */
938 }
941
944 skip_bits1(&s->
gb);
/* Continuous Presence Multipoint mode: off */
945
950 } else {
951 int ufep;
952
953 /* H.263v2 */
955 ufep =
get_bits(&s->
gb, 3);
/* Update Full Extended PTYPE */
956
957 /* ufep other than 0 and 1 are reserved */
958 if (ufep == 1) {
959 /* OPPTYPE */
966 }
973
977 }
980 }
985
986 skip_bits(&s->
gb, 1);
/* Prevent start code emulation */
987
989 } else if (ufep != 0) {
991 return -1;
992 }
993
994 /* MPPTYPE */
1002 default:
1003 return -1;
1004 }
1008
1009 /* Get the picture dimensions */
1010 if (ufep) {
1011 if (format == 6) {
1012 /* Custom Picture Format (CPFMT) */
1015 /* aspect ratios:
1016 0 - forbidden
1017 1 - 1:1
1018 2 - 12:11 (CIF 4:3)
1019 3 - 10:11 (525-type 4:3)
1020 4 - 16:11 (CIF 16:9)
1021 5 - 40:33 (525-type 16:9)
1022 6-14 - reserved
1023 */
1027 ff_dlog(s->
avctx,
"\nH.263+ Custom picture: %dx%d\n",width,height);
1029 /* aspected dimensions */
1032 }else{
1034 }
1035 } else {
1039 }
1041 if ((width == 0) || (height == 0))
1042 return -1;
1045
1047 int gcd;
1053 return -1;
1054 }
1058 }else{
1060 }
1061 }
1062
1064 skip_bits(&s->
gb, 2);
//extended Temporal reference
1065 }
1066
1067 if (ufep) {
1069 if(
get_bits1(&s->
gb)==0)
/* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
1071 }
1075 }
1078 }
1079 }
1080 }
1081
1083 }
1084
1087 return -1;
1088 }
1092
1094 skip_bits(&s->
gb, 3);
/* Temporal reference for B-pictures */
1096 skip_bits(&s->
gb, 2);
//extended Temporal reference
1097 skip_bits(&s->
gb, 2);
/* Quantization information for B-pictures */
1098 }
1099
1104 }else{
1112 }
1114 }
1115
1116 /* PEI */
1119
1122 return -1;
1123 }
1124
1126
1128 return -1;
1129 }
1130 }
1132
1136 }else{
1139 }
1140
1143 int i,j;
1146 for(i=0; i<13; i++){
1147 for(j=0; j<3; j++){
1151 }
1153 }
1155 }
1156
1157 return 0;
1158 }
av_cold void ff_h263_decode_init_vlc(void)
int rv10_first_dc_coded[3]
const char const char void * val
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
ScanTable intra_v_scantable
const uint8_t ff_cbpc_b_tab[4][2]
static int h263_decode_gob_header(MpegEncContext *s)
Decode the group of blocks header or slice header.
static int shift(int a, int b)
VLC ff_h263_inter_MCBPC_vlc
const uint8_t * y_dc_scale_table
qscale -> y_dc_scale table
void(* clear_block)(int16_t *block)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
const uint8_t ff_h263_intra_MCBPC_code[9]
#define SKIP_COUNTER(name, gb, num)
const uint8_t ff_h263_cbpy_tab[16][2]
void(* clear_blocks)(int16_t *blocks)
int obmc
overlapped block motion compensation
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
static int h263_decode_block(MpegEncContext *s, int16_t *block, int n, int coded)
const uint16_t ff_h263_format[8][2]
int mb_num
number of MBs of a picture
const uint8_t ff_modified_quant_tab[2][32]
static int get_sbits(GetBitContext *s, int n)
int h263_aic
Advanded INTRA Coding (AIC)
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Macro definitions for various function/variable attributes.
#define USES_LIST(a, list)
int alt_inter_vlc
alternative inter vlc
int mb_num_left
number of MBs left in this video packet (for partitioned Slices only)
int64_t time
time of current frame
const uint8_t ff_mpeg1_dc_scale_table[128]
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) ...
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
const uint8_t ff_h263_intra_MCBPC_bits[9]
const uint8_t ff_mvtab[33][2]
static av_cold int end(AVCodecContext *avctx)
static VLC h263_mbtype_b_vlc
int no_rounding
apply no rounding to motion compensation (MPEG4, msmpeg4, ...) for b-frames rounding mode is always 0...
const uint8_t ff_h263_inter_MCBPC_bits[28]
Picture current_picture
copy of the current picture structure.
GetBitContext last_resync_gb
used to search for the next resync marker
static int get_bits_count(const GetBitContext *s)
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
uint16_t pp_time
time distance between the last 2 p,s,i frames
int mb_height
number of MBs horizontally & vertically
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
static int h263_skip_b_part(MpegEncContext *s, int cbp)
int codec_tag
internal codec_tag upper case converted from avctx codec_tag
const AVRational ff_h263_pixel_aspect[16]
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
const uint8_t ff_mba_length[7]
static int get_bits_left(GetBitContext *gb)
#define H263_MBTYPE_B_VLC_BITS
int h263_plus
h263 plus headers
#define UPDATE_CACHE(name, gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int last_dc[3]
last DC values for MPEG1
int mb_skipped
MUST BE SET only during DECODING.
int unrestricted_mv
mv can point outside of the coded picture
int ff_h263_decode_motion(MpegEncContext *s, int pred, int f_code)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static const int h263_mb_type_b_map[15]
int h263_slice_structured
#define INTER_MCBPC_VLC_BITS
int64_t av_gcd(int64_t a, int64_t b)
Return the greatest common divisor of a and b.
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)
Decode the next video packet.
static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
#define CLOSE_READER(name, gb)
#define INIT_VLC_RL(rl, static_size)
Libavcodec external API header.
static int check_marker(GetBitContext *s, const char *msg)
common internal API header
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
int umvplus
== H263+ && unrestricted_mv
int16_t(*[2] motion_val)[2]
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
const uint16_t ff_mba_max[6]
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
int block_last_index[12]
last non zero coefficient in block
int pb_frame
PB frame mode (0 = none, 1 = base, 2 = improved)
const uint8_t ff_aic_dc_scale_table[32]
int ff_h263_decode_mba(MpegEncContext *s)
const uint8_t ff_h263_inter_MCBPC_code[28]
RL_VLC_ELEM * rl_vlc[32]
decoding only
#define SHOW_UBITS(name, gb, num)
static int h263p_decode_umotion(MpegEncContext *s, int pred)
int block_index[6]
index to current MB in block based arrays with edges
static const float pred[4]
static const int8_t mv[256][2]
#define MV_TYPE_16X16
1 vector for the whole mb
int h263_flv
use flv h263 header
uint8_t ff_h263_static_rl_table_store[2][2][2 *MAX_RUN+MAX_LEVEL+3]
ScanTable intra_scantable
int height
picture size. must be a multiple of 16
#define OPEN_READER(name, gb)
av_cold int ff_rl_init(RLTable *rl, uint8_t static_store[2][2 *MAX_RUN+MAX_LEVEL+3])
#define SLICE_END
end marker found
VLC ff_h263_intra_MCBPC_vlc
static unsigned int get_bits1(GetBitContext *s)
BYTE int const BYTE int int int height
static void skip_bits1(GetBitContext *s)
ScanTable intra_h_scantable
static void skip_bits(GetBitContext *s, int n)
rational number numerator/denominator
int ff_h263_resync(MpegEncContext *s)
Decode the group of blocks / video packet header.
#define SKIP_CACHE(name, gb, num)
int f_code
forward MV resolution
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
int ff_h263_decode_picture_header(MpegEncContext *s)
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
const uint8_t ff_h263_mbtype_b_tab[15][2]
static av_const int sign_extend(int val, unsigned bits)
static void h263_decode_dquant(MpegEncContext *s)
int h263_pred
use mpeg4/h263 ac/dc predictions
const uint8_t * c_dc_scale_table
qscale -> c_dc_scale table
#define FF_ASPECT_EXTENDED
#define FF_DEBUG_PICT_INFO
int mv[2][4][2]
motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend...
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
struct AVCodecContext * avctx
#define SHOW_SBITS(name, gb, num)
GLint GLenum GLboolean GLsizei stride
common internal api header.
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
void ff_h263_pred_acdc(MpegEncContext *s, int16_t *block, int n)
const uint8_t ff_h263_chroma_qscale_table[32]
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
int ff_rv_decode_dc(MpegEncContext *s, int n)
#define AV_EF_BITSTREAM
detect bitstream specification deviations
const uint8_t * chroma_qscale_table
qscale -> chroma_qscale (h263)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
void ff_h263_show_pict_info(MpegEncContext *s)
Print picture info if FF_DEBUG_PICT_INFO is set.
int16_t(* block)[64]
points to one of the following blocks
VLC_TYPE(* table)[2]
code, bits
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
static const uint8_t * align_get_bits(GetBitContext *s)
int chroma_qscale
chroma QP
int frame_number
Frame counter, set by libavcodec.
static void preview_obmc(MpegEncContext *s)
read the next MVs for OBMC.
uint32_t * mb_type
types and macros are defined in mpegutils.h
#define LOCAL_ALIGNED_16(t, v,...)
int rv10_version
RV10 version: 0 or 3.
static int skip_1stop_8data_bits(GetBitContext *gb)
int h263_long_vectors
use horrible h263v1 long vector mode
#define MV_TYPE_8X8
4 vectors (h263, mpeg4 4MV)
int h263_aic_dir
AIC direction: 0 = left, 1 = top.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
int ff_h263_decode_mb(MpegEncContext *s, int16_t block[6][64])
#define INTRA_MCBPC_VLC_BITS
uint16_t pb_time
time distance between the last b and p,s,i frame