Mercurial > libavcodec.hg
comparison h263.c @ 10791:48adb5a1b47b libavcodec
Split out intel H263 decoder.
author | michael |
---|---|
date | Thu, 07 Jan 2010 06:25:41 +0000 |
parents | 0c8f9288b5e4 |
children | 9b3ec3d1bdae |
comparison
equal
deleted
inserted
replaced
10790:145b62a1de1c | 10791:48adb5a1b47b |
---|---|
131 return 5; | 131 return 5; |
132 else | 132 else |
133 return 7; | 133 return 7; |
134 } | 134 } |
135 | 135 |
136 static void show_pict_info(MpegEncContext *s){ | 136 void ff_h263_show_pict_info(MpegEncContext *s){ |
137 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", | 137 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", |
138 s->qscale, av_get_pict_type_char(s->pict_type), | 138 s->qscale, av_get_pict_type_char(s->pict_type), |
139 s->gb.size_in_bits, 1-s->no_rounding, | 139 s->gb.size_in_bits, 1-s->no_rounding, |
140 s->obmc ? " AP" : "", | 140 s->obmc ? " AP" : "", |
141 s->umvplus ? " UMV" : "", | 141 s->umvplus ? " UMV" : "", |
5357 s->y_dc_scale_table= | 5357 s->y_dc_scale_table= |
5358 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | 5358 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; |
5359 } | 5359 } |
5360 | 5360 |
5361 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ | 5361 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
5362 show_pict_info(s); | 5362 ff_h263_show_pict_info(s); |
5363 } | 5363 } |
5364 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){ | 5364 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){ |
5365 int i,j; | 5365 int i,j; |
5366 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); | 5366 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); |
5367 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | 5367 av_log(s->avctx, AV_LOG_DEBUG, "\n"); |
6062 if(s->flags& CODEC_FLAG_LOW_DELAY) | 6062 if(s->flags& CODEC_FLAG_LOW_DELAY) |
6063 s->low_delay=1; | 6063 s->low_delay=1; |
6064 s->avctx->has_b_frames= !s->low_delay; | 6064 s->avctx->has_b_frames= !s->low_delay; |
6065 return decode_vop_header(s, gb); | 6065 return decode_vop_header(s, gb); |
6066 } | 6066 } |
6067 | |
6068 /* don't understand why they choose a different header ! */ | |
6069 int intel_h263_decode_picture_header(MpegEncContext *s) | |
6070 { | |
6071 int format; | |
6072 | |
6073 /* picture header */ | |
6074 if (get_bits_long(&s->gb, 22) != 0x20) { | |
6075 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); | |
6076 return -1; | |
6077 } | |
6078 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ | |
6079 | |
6080 if (get_bits1(&s->gb) != 1) { | |
6081 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n"); | |
6082 return -1; /* marker */ | |
6083 } | |
6084 if (get_bits1(&s->gb) != 0) { | |
6085 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n"); | |
6086 return -1; /* h263 id */ | |
6087 } | |
6088 skip_bits1(&s->gb); /* split screen off */ | |
6089 skip_bits1(&s->gb); /* camera off */ | |
6090 skip_bits1(&s->gb); /* freeze picture release off */ | |
6091 | |
6092 format = get_bits(&s->gb, 3); | |
6093 if (format != 7) { | |
6094 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n"); | |
6095 return -1; | |
6096 } | |
6097 s->h263_plus = 0; | |
6098 | |
6099 s->pict_type = FF_I_TYPE + get_bits1(&s->gb); | |
6100 | |
6101 s->unrestricted_mv = get_bits1(&s->gb); | |
6102 s->h263_long_vectors = s->unrestricted_mv; | |
6103 | |
6104 if (get_bits1(&s->gb) != 0) { | |
6105 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n"); | |
6106 return -1; /* SAC: off */ | |
6107 } | |
6108 s->obmc= get_bits1(&s->gb); | |
6109 s->pb_frame = get_bits1(&s->gb); | |
6110 | |
6111 if(format == 7){ | |
6112 format = get_bits(&s->gb, 3); | |
6113 if(format == 0 || format == 7){ | |
6114 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n"); | |
6115 return -1; | |
6116 } | |
6117 if(get_bits(&s->gb, 2)) | |
6118 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); | |
6119 s->loop_filter = get_bits1(&s->gb); | |
6120 if(get_bits1(&s->gb)) | |
6121 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); | |
6122 if(get_bits1(&s->gb)) | |
6123 s->pb_frame = 2; | |
6124 if(get_bits(&s->gb, 5)) | |
6125 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); | |
6126 if(get_bits(&s->gb, 5) != 1) | |
6127 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n"); | |
6128 } | |
6129 if(format == 6){ | |
6130 int ar = get_bits(&s->gb, 4); | |
6131 skip_bits(&s->gb, 9); // display width | |
6132 skip_bits1(&s->gb); | |
6133 skip_bits(&s->gb, 9); // display height | |
6134 if(ar == 15){ | |
6135 skip_bits(&s->gb, 8); // aspect ratio - width | |
6136 skip_bits(&s->gb, 8); // aspect ratio - height | |
6137 } | |
6138 } | |
6139 | |
6140 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); | |
6141 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ | |
6142 | |
6143 if(s->pb_frame){ | |
6144 skip_bits(&s->gb, 3); //temporal reference for B-frame | |
6145 skip_bits(&s->gb, 2); //dbquant | |
6146 } | |
6147 | |
6148 /* PEI */ | |
6149 while (get_bits1(&s->gb) != 0) { | |
6150 skip_bits(&s->gb, 8); | |
6151 } | |
6152 s->f_code = 1; | |
6153 | |
6154 s->y_dc_scale_table= | |
6155 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
6156 | |
6157 if(s->avctx->debug&FF_DEBUG_PICT_INFO) | |
6158 show_pict_info(s); | |
6159 | |
6160 return 0; | |
6161 } |