Mercurial > libavcodec.hg
annotate mpeg12.c @ 5319:40af705cef7e libavcodec
AC-3 decoder, soc revision 69, Aug 31 07:12:56 2006 UTC by cloud9
Fix the bugs:
1. The quality of output because of incorrect windowing coefficients.
New code for window generation.
2. Dynrng values were reset where dynrng value is present in the first block,
but not in the subsequent block.
| author | jbr |
|---|---|
| date | Sat, 14 Jul 2007 16:03:14 +0000 |
| parents | b52fd9b223bb |
| children | 4e7308c09d2e |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 5208 | 2 * MPEG1/2 decoder |
| 429 | 3 * Copyright (c) 2000,2001 Fabrice Bellard. |
| 2967 | 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
| 0 | 5 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3776
diff
changeset
|
6 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3776
diff
changeset
|
7 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3776
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
| 429 | 9 * modify it under the terms of the GNU Lesser General Public |
| 10 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3776
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 12 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3776
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 * Lesser General Public License for more details. | |
| 0 | 17 * |
| 429 | 18 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3776
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 21 */ |
| 2967 | 22 |
| 1106 | 23 /** |
| 24 * @file mpeg12.c | |
| 5208 | 25 * MPEG1/2 decoder |
| 1106 | 26 */ |
| 2967 | 27 |
| 76 | 28 //#define DEBUG |
| 0 | 29 #include "avcodec.h" |
| 30 #include "dsputil.h" | |
| 31 #include "mpegvideo.h" | |
| 32 | |
| 5208 | 33 #include "mpeg12.h" |
| 0 | 34 #include "mpeg12data.h" |
| 5208 | 35 #include "mpeg12decdata.h" |
|
4623
e541c0dd35dd
imx dump header bitstream filter, modifies bitstream to fit in mov and be decoded by final cut pro decoder
bcoudurier
parents:
4621
diff
changeset
|
36 #include "bytestream.h" |
| 0 | 37 |
| 1708 | 38 //#undef NDEBUG |
| 39 //#include <assert.h> | |
| 40 | |
| 694 | 41 |
| 552 | 42 #define DC_VLC_BITS 9 |
| 43 #define MV_VLC_BITS 9 | |
| 44 #define MBINCR_VLC_BITS 9 | |
| 45 #define MB_PAT_VLC_BITS 9 | |
| 46 #define MB_PTYPE_VLC_BITS 6 | |
| 47 #define MB_BTYPE_VLC_BITS 6 | |
| 48 #define TEX_VLC_BITS 9 | |
| 49 | |
| 2967 | 50 static inline int mpeg1_decode_block_inter(MpegEncContext *s, |
| 51 DCTELEM *block, | |
| 711 | 52 int n); |
| 2967 | 53 static inline int mpeg1_decode_block_intra(MpegEncContext *s, |
| 54 DCTELEM *block, | |
| 0 | 55 int n); |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
56 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n); |
| 2967 | 57 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, |
| 58 DCTELEM *block, | |
| 0 | 59 int n); |
| 2967 | 60 static inline int mpeg2_decode_block_intra(MpegEncContext *s, |
| 61 DCTELEM *block, | |
| 0 | 62 int n); |
| 2201 | 63 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, DCTELEM *block, int n); |
| 2622 | 64 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, DCTELEM *block, int n); |
| 0 | 65 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); |
| 1620 | 66 static void exchange_uv(MpegEncContext *s); |
| 0 | 67 |
| 1381 | 68 extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx); |
| 69 extern int XVMC_field_end(MpegEncContext *s); | |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
70 extern void XVMC_pack_pblocks(MpegEncContext *s,int cbp); |
| 1620 | 71 extern void XVMC_init_block(MpegEncContext *s);//set s->block |
| 1381 | 72 |
| 4180 | 73 static const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1}; |
| 74 static const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1}; | |
| 75 static const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1}; | |
| 76 static const enum PixelFormat pixfmt_xvmc_mpg2_420[] = { | |
| 1821 | 77 PIX_FMT_XVMC_MPEG2_IDCT, |
| 78 PIX_FMT_XVMC_MPEG2_MC, | |
| 2979 | 79 -1}; |
|
281
1fc96b02142e
mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents:
277
diff
changeset
|
80 |
| 5210 | 81 uint8_t ff_mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3]; |
| 4668 | 82 |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
83 static void init_2d_vlc_rl(RLTable *rl, int use_static) |
| 552 | 84 { |
|
620
a5aa53b6e648
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michaelni
parents:
617
diff
changeset
|
85 int i; |
| 2967 | 86 |
| 87 init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2, | |
| 552 | 88 &rl->table_vlc[0][1], 4, 2, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
89 &rl->table_vlc[0][0], 4, 2, use_static); |
| 552 | 90 |
| 2967 | 91 if(use_static) |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
92 rl->rl_vlc[0]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
93 else |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
94 rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
95 |
| 552 | 96 for(i=0; i<rl->vlc.table_size; i++){ |
| 97 int code= rl->vlc.table[i][0]; | |
| 98 int len = rl->vlc.table[i][1]; | |
| 99 int level, run; | |
| 2967 | 100 |
| 552 | 101 if(len==0){ // illegal code |
| 102 run= 65; | |
| 103 level= MAX_LEVEL; | |
| 104 }else if(len<0){ //more bits needed | |
| 105 run= 0; | |
| 106 level= code; | |
| 107 }else{ | |
| 108 if(code==rl->n){ //esc | |
| 109 run= 65; | |
| 110 level= 0; | |
| 111 }else if(code==rl->n+1){ //eob | |
| 711 | 112 run= 0; |
| 113 level= 127; | |
| 552 | 114 }else{ |
| 115 run= rl->table_run [code] + 1; | |
| 116 level= rl->table_level[code]; | |
| 117 } | |
| 118 } | |
| 119 rl->rl_vlc[0][i].len= len; | |
| 120 rl->rl_vlc[0][i].level= level; | |
| 121 rl->rl_vlc[0][i].run= run; | |
| 122 } | |
| 123 } | |
| 124 | |
| 5210 | 125 void ff_mpeg12_common_init(MpegEncContext *s) |
| 498 | 126 { |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
127 |
| 498 | 128 s->y_dc_scale_table= |
| 1992 | 129 s->c_dc_scale_table= mpeg2_dc_scale_table[s->intra_dc_precision]; |
| 1903 | 130 |
| 498 | 131 } |
| 132 | |
| 1325 | 133 void ff_mpeg1_clean_buffers(MpegEncContext *s){ |
| 134 s->last_dc[0] = 1 << (7 + s->intra_dc_precision); | |
| 135 s->last_dc[1] = s->last_dc[0]; | |
| 136 s->last_dc[2] = s->last_dc[0]; | |
| 137 memset(s->last_mv, 0, sizeof(s->last_mv)); | |
| 138 } | |
| 139 | |
| 0 | 140 |
| 141 /******************************************/ | |
| 142 /* decoding */ | |
| 143 | |
| 144 static VLC dc_lum_vlc; | |
| 145 static VLC dc_chroma_vlc; | |
| 146 static VLC mv_vlc; | |
| 147 static VLC mbincr_vlc; | |
| 148 static VLC mb_ptype_vlc; | |
| 149 static VLC mb_btype_vlc; | |
| 150 static VLC mb_pat_vlc; | |
| 151 | |
| 1904 | 152 static void init_vlcs(void) |
| 0 | 153 { |
| 154 static int done = 0; | |
| 155 | |
| 156 if (!done) { | |
| 494 | 157 done = 1; |
| 0 | 158 |
| 2967 | 159 init_vlc(&dc_lum_vlc, DC_VLC_BITS, 12, |
| 5210 | 160 ff_mpeg12_vlc_dc_lum_bits, 1, 1, |
| 161 ff_mpeg12_vlc_dc_lum_code, 2, 2, 1); | |
| 2967 | 162 init_vlc(&dc_chroma_vlc, DC_VLC_BITS, 12, |
| 5210 | 163 ff_mpeg12_vlc_dc_chroma_bits, 1, 1, |
| 164 ff_mpeg12_vlc_dc_chroma_code, 2, 2, 1); | |
| 2967 | 165 init_vlc(&mv_vlc, MV_VLC_BITS, 17, |
| 5210 | 166 &ff_mpeg12_mbMotionVectorTable[0][1], 2, 1, |
| 167 &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 1); | |
| 2967 | 168 init_vlc(&mbincr_vlc, MBINCR_VLC_BITS, 36, |
| 5210 | 169 &ff_mpeg12_mbAddrIncrTable[0][1], 2, 1, |
| 170 &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 1); | |
| 1853 | 171 init_vlc(&mb_pat_vlc, MB_PAT_VLC_BITS, 64, |
| 5210 | 172 &ff_mpeg12_mbPatTable[0][1], 2, 1, |
| 173 &ff_mpeg12_mbPatTable[0][0], 2, 1, 1); | |
| 2967 | 174 |
| 175 init_vlc(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7, | |
| 0 | 176 &table_mb_ptype[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
177 &table_mb_ptype[0][0], 2, 1, 1); |
| 2967 | 178 init_vlc(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11, |
| 0 | 179 &table_mb_btype[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2302
diff
changeset
|
180 &table_mb_btype[0][0], 2, 1, 1); |
| 5210 | 181 init_rl(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]); |
| 182 init_rl(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]); | |
| 552 | 183 |
| 5210 | 184 init_2d_vlc_rl(&ff_rl_mpeg1, 1); |
| 185 init_2d_vlc_rl(&ff_rl_mpeg2, 1); | |
| 0 | 186 } |
| 187 } | |
| 188 | |
| 189 static inline int get_dmv(MpegEncContext *s) | |
| 190 { | |
| 2967 | 191 if(get_bits1(&s->gb)) |
| 21 | 192 return 1 - (get_bits1(&s->gb) << 1); |
| 0 | 193 else |
| 194 return 0; | |
| 195 } | |
| 196 | |
| 54 | 197 static inline int get_qscale(MpegEncContext *s) |
| 198 { | |
|
1253
5642ebadf1b5
small optimize mpeg12.c/get_qscale patch by (BERO <bero at geocities dot co dot jp>) and the return idea by arpi
michaelni
parents:
1220
diff
changeset
|
199 int qscale = get_bits(&s->gb, 5); |
| 1728 | 200 if (s->q_scale_type) { |
| 201 return non_linear_qscale[qscale]; | |
| 202 } else { | |
| 203 return qscale << 1; | |
| 54 | 204 } |
| 205 } | |
| 206 | |
| 0 | 207 /* motion type (for mpeg2) */ |
| 208 #define MT_FIELD 1 | |
| 209 #define MT_FRAME 2 | |
| 210 #define MT_16X8 2 | |
| 211 #define MT_DMV 3 | |
| 212 | |
| 213 static int mpeg_decode_mb(MpegEncContext *s, | |
|
1848
c72589baee53
initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents:
1841
diff
changeset
|
214 DCTELEM block[12][64]) |
| 0 | 215 { |
| 751 | 216 int i, j, k, cbp, val, mb_type, motion_type; |
|
2591
65874d96c2da
Typo errors patch by (QuickTime | ffmpeg gmail com>
michael
parents:
2590
diff
changeset
|
217 const int mb_block_count = 4 + (1<< s->chroma_format); |
| 2076 | 218 |
| 4652 | 219 dprintf(s->avctx, "decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); |
| 0 | 220 |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2624
diff
changeset
|
221 assert(s->mb_skipped==0); |
|
1021
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
947
diff
changeset
|
222 |
| 1160 | 223 if (s->mb_skip_run-- != 0) { |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
224 if(s->pict_type == I_TYPE){ |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2624
diff
changeset
|
225 av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
226 return -1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
227 } |
| 2967 | 228 |
| 0 | 229 /* skip mb */ |
| 230 s->mb_intra = 0; | |
|
1848
c72589baee53
initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents:
1841
diff
changeset
|
231 for(i=0;i<12;i++) |
| 0 | 232 s->block_last_index[i] = -1; |
| 1841 | 233 if(s->picture_structure == PICT_FRAME) |
| 234 s->mv_type = MV_TYPE_16X16; | |
| 235 else | |
| 236 s->mv_type = MV_TYPE_FIELD; | |
| 0 | 237 if (s->pict_type == P_TYPE) { |
| 238 /* if P type, zero motion vector is implied */ | |
| 239 s->mv_dir = MV_DIR_FORWARD; | |
| 240 s->mv[0][0][0] = s->mv[0][0][1] = 0; | |
| 241 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0; | |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
242 s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0; |
| 1841 | 243 s->field_select[0][0]= s->picture_structure - 1; |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2624
diff
changeset
|
244 s->mb_skipped = 1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
245 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; |
| 0 | 246 } else { |
| 2575 | 247 int mb_type; |
| 2967 | 248 |
| 2575 | 249 if(s->mb_x) |
| 250 mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]; | |
| 251 else | |
| 2967 | 252 mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1]; // FIXME not sure if this is allowed in mpeg at all, |
| 2575 | 253 if(IS_INTRA(mb_type)) |
| 254 return -1; | |
| 2967 | 255 |
| 0 | 256 /* if B type, reuse previous vectors and directions */ |
| 257 s->mv[0][0][0] = s->last_mv[0][0][0]; | |
| 258 s->mv[0][0][1] = s->last_mv[0][0][1]; | |
| 259 s->mv[1][0][0] = s->last_mv[1][0][0]; | |
| 260 s->mv[1][0][1] = s->last_mv[1][0][1]; | |
|
1021
2d7c9f5738de
trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents:
947
diff
changeset
|
261 |
| 2967 | 262 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= |
| 2575 | 263 mb_type | MB_TYPE_SKIP; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
264 // assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8)); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
265 |
| 2967 | 266 if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0) |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2624
diff
changeset
|
267 s->mb_skipped = 1; |
| 0 | 268 } |
| 930 | 269 |
| 0 | 270 return 0; |
| 271 } | |
| 272 | |
| 273 switch(s->pict_type) { | |
| 274 default: | |
| 275 case I_TYPE: | |
| 21 | 276 if (get_bits1(&s->gb) == 0) { |
| 1376 | 277 if (get_bits1(&s->gb) == 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
278 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y); |
| 0 | 279 return -1; |
| 1376 | 280 } |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
281 mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA; |
| 0 | 282 } else { |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
283 mb_type = MB_TYPE_INTRA; |
| 0 | 284 } |
| 285 break; | |
| 286 case P_TYPE: | |
| 545 | 287 mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1); |
| 568 | 288 if (mb_type < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
289 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y); |
| 0 | 290 return -1; |
| 568 | 291 } |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
292 mb_type = ptype2mb_type[ mb_type ]; |
| 0 | 293 break; |
| 294 case B_TYPE: | |
| 545 | 295 mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1); |
| 568 | 296 if (mb_type < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
297 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y); |
| 0 | 298 return -1; |
| 568 | 299 } |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
300 mb_type = btype2mb_type[ mb_type ]; |
| 0 | 301 break; |
| 302 } | |
| 4652 | 303 dprintf(s->avctx, "mb_type=%x\n", mb_type); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
304 // motion_type = 0; /* avoid warning */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
305 if (IS_INTRA(mb_type)) { |
| 2624 | 306 s->dsp.clear_blocks(s->block[0]); |
| 2967 | 307 |
| 2624 | 308 if(!s->chroma_y_shift){ |
| 309 s->dsp.clear_blocks(s->block[6]); | |
| 310 } | |
| 2967 | 311 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
312 /* compute dct type */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
313 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
314 !s->frame_pred_frame_dct) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
315 s->interlaced_dct = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
316 } |
| 0 | 317 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
318 if (IS_QUANT(mb_type)) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
319 s->qscale = get_qscale(s); |
| 2967 | 320 |
| 0 | 321 if (s->concealment_motion_vectors) { |
| 322 /* just parse them */ | |
| 2967 | 323 if (s->picture_structure != PICT_FRAME) |
| 21 | 324 skip_bits1(&s->gb); /* field select */ |
| 2967 | 325 |
| 326 s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = | |
| 1323 | 327 mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); |
| 2967 | 328 s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = |
| 1323 | 329 mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); |
| 330 | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
331 skip_bits1(&s->gb); /* marker */ |
| 1323 | 332 }else |
| 333 memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ | |
| 0 | 334 s->mb_intra = 1; |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
335 #ifdef HAVE_XVMC |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
336 //one 1 we memcpy blocks in xvmcvideo |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
337 if(s->avctx->xvmc_acceleration > 1){ |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
338 XVMC_pack_pblocks(s,-1);//inter are always full blocks |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
339 if(s->swap_uv){ |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
340 exchange_uv(s); |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
341 } |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
342 } |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
343 #endif |
| 0 | 344 |
| 1421 | 345 if (s->codec_id == CODEC_ID_MPEG2VIDEO) { |
| 2622 | 346 if(s->flags2 & CODEC_FLAG2_FAST){ |
| 347 for(i=0;i<6;i++) { | |
| 348 mpeg2_fast_decode_block_intra(s, s->pblocks[i], i); | |
| 349 } | |
| 350 }else{ | |
| 351 for(i=0;i<mb_block_count;i++) { | |
| 352 if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0) | |
| 353 return -1; | |
| 354 } | |
| 0 | 355 } |
| 356 } else { | |
| 357 for(i=0;i<6;i++) { | |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
358 if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0) |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
359 return -1; |
| 0 | 360 } |
| 361 } | |
| 362 } else { | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
363 if (mb_type & MB_TYPE_ZERO_MV){ |
| 1655 | 364 assert(mb_type & MB_TYPE_CBP); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
365 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
366 /* compute dct type */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
367 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
368 !s->frame_pred_frame_dct) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
369 s->interlaced_dct = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
370 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
371 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
372 if (IS_QUANT(mb_type)) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
373 s->qscale = get_qscale(s); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
374 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
375 s->mv_dir = MV_DIR_FORWARD; |
| 1841 | 376 if(s->picture_structure == PICT_FRAME) |
| 377 s->mv_type = MV_TYPE_16X16; | |
| 378 else{ | |
| 379 s->mv_type = MV_TYPE_FIELD; | |
| 380 mb_type |= MB_TYPE_INTERLACED; | |
| 381 s->field_select[0][0]= s->picture_structure - 1; | |
| 382 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
383 s->last_mv[0][0][0] = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
384 s->last_mv[0][0][1] = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
385 s->last_mv[0][1][0] = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
386 s->last_mv[0][1][1] = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
387 s->mv[0][0][0] = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
388 s->mv[0][0][1] = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
389 }else{ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
390 assert(mb_type & MB_TYPE_L0L1); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
391 //FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED |
| 4795 | 392 /* get additional motion vector type */ |
| 2967 | 393 if (s->frame_pred_frame_dct) |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
394 motion_type = MT_FRAME; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
395 else{ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
396 motion_type = get_bits(&s->gb, 2); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
397 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
398 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
399 /* compute dct type */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
400 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? |
| 1655 | 401 !s->frame_pred_frame_dct && HAS_CBP(mb_type)) { |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
402 s->interlaced_dct = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
403 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
404 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
405 if (IS_QUANT(mb_type)) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
406 s->qscale = get_qscale(s); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
407 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
408 /* motion vectors */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
409 s->mv_dir = 0; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
410 for(i=0;i<2;i++) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
411 if (USES_LIST(mb_type, i)) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
412 s->mv_dir |= (MV_DIR_FORWARD >> i); |
| 4652 | 413 dprintf(s->avctx, "motion_type=%d\n", motion_type); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
414 switch(motion_type) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
415 case MT_FRAME: /* or MT_16X8 */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
416 if (s->picture_structure == PICT_FRAME) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
417 /* MT_FRAME */ |
| 2967 | 418 mb_type |= MB_TYPE_16x16; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
419 s->mv_type = MV_TYPE_16X16; |
| 2967 | 420 s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] = |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
421 mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]); |
| 2967 | 422 s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] = |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
423 mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
424 /* full_pel: only for mpeg1 */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
425 if (s->full_pel[i]){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
426 s->mv[i][0][0] <<= 1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
427 s->mv[i][0][1] <<= 1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
428 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
429 } else { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
430 /* MT_16X8 */ |
| 2967 | 431 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
432 s->mv_type = MV_TYPE_16X8; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
433 for(j=0;j<2;j++) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
434 s->field_select[i][j] = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
435 for(k=0;k<2;k++) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
436 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
437 s->last_mv[i][j][k]); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
438 s->last_mv[i][j][k] = val; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
439 s->mv[i][j][k] = val; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
440 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
441 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
442 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
443 break; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
444 case MT_FIELD: |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
445 s->mv_type = MV_TYPE_FIELD; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
446 if (s->picture_structure == PICT_FRAME) { |
| 2967 | 447 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
448 for(j=0;j<2;j++) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
449 s->field_select[i][j] = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
450 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0], |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
451 s->last_mv[i][j][0]); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
452 s->last_mv[i][j][0] = val; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
453 s->mv[i][j][0] = val; |
| 4652 | 454 dprintf(s->avctx, "fmx=%d\n", val); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
455 val = mpeg_decode_motion(s, s->mpeg_f_code[i][1], |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
456 s->last_mv[i][j][1] >> 1); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
457 s->last_mv[i][j][1] = val << 1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
458 s->mv[i][j][1] = val; |
| 4652 | 459 dprintf(s->avctx, "fmy=%d\n", val); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
460 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
461 } else { |
| 2967 | 462 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
463 s->field_select[i][0] = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
464 for(k=0;k<2;k++) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
465 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
466 s->last_mv[i][0][k]); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
467 s->last_mv[i][0][k] = val; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
468 s->last_mv[i][1][k] = val; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
469 s->mv[i][0][k] = val; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
470 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
471 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
472 break; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
473 case MT_DMV: |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
474 { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
475 int dmx, dmy, mx, my, m; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
476 |
| 2967 | 477 mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0], |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
478 s->last_mv[i][0][0]); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
479 s->last_mv[i][0][0] = mx; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
480 s->last_mv[i][1][0] = mx; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
481 dmx = get_dmv(s); |
| 2967 | 482 my = mpeg_decode_motion(s, s->mpeg_f_code[i][1], |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
483 s->last_mv[i][0][1] >> 1); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
484 dmy = get_dmv(s); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
485 s->mv_type = MV_TYPE_DMV; |
|
1326
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
486 |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
487 |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
488 s->last_mv[i][0][1] = my<<1; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
489 s->last_mv[i][1][1] = my<<1; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
490 |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
491 s->mv[i][0][0] = mx; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
492 s->mv[i][0][1] = my; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
493 s->mv[i][1][0] = mx;//not used |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
494 s->mv[i][1][1] = my;//not used |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
495 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
496 if (s->picture_structure == PICT_FRAME) { |
| 2967 | 497 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
498 |
|
1326
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
499 //m = 1 + 2 * s->top_field_first; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
500 m = s->top_field_first ? 1 : 3; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
501 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
502 /* top -> top pred */ |
|
1326
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
503 s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
504 s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
505 m = 4 - m; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
506 s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
507 s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
508 } else { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
509 mb_type |= MB_TYPE_16x16; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
510 |
|
1326
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
511 s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
512 s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy; |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
513 if(s->picture_structure == PICT_TOP_FIELD) |
|
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
514 s->mv[i][2][1]--; |
| 2967 | 515 else |
|
1326
6cdd3b8f4fd3
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents:
1325
diff
changeset
|
516 s->mv[i][2][1]++; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
517 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
518 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
519 break; |
| 1673 | 520 default: |
| 521 av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y); | |
| 522 return -1; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
523 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
524 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
525 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
526 } |
| 2967 | 527 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
528 s->mb_intra = 0; |
| 2624 | 529 if (HAS_CBP(mb_type)) { |
| 530 s->dsp.clear_blocks(s->block[0]); | |
| 2967 | 531 |
| 2624 | 532 if(!s->chroma_y_shift){ |
| 533 s->dsp.clear_blocks(s->block[6]); | |
| 534 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
535 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
536 cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 1); |
| 1858 | 537 if (cbp < 0 || ((cbp == 0) && (s->chroma_format < 2)) ){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
538 av_log(s->avctx, AV_LOG_ERROR, "invalid cbp at %d %d\n", s->mb_x, s->mb_y); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
539 return -1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
540 } |
| 2076 | 541 if(mb_block_count > 6){ |
| 2979 | 542 cbp<<= mb_block_count-6; |
| 543 cbp |= get_bits(&s->gb, mb_block_count-6); | |
|
1848
c72589baee53
initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents:
1841
diff
changeset
|
544 } |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
545 |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
546 #ifdef HAVE_XVMC |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
547 //on 1 we memcpy blocks in xvmcvideo |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
548 if(s->avctx->xvmc_acceleration > 1){ |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
549 XVMC_pack_pblocks(s,cbp); |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
550 if(s->swap_uv){ |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
551 exchange_uv(s); |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
552 } |
| 2967 | 553 } |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
554 #endif |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
555 |
| 1421 | 556 if (s->codec_id == CODEC_ID_MPEG2VIDEO) { |
| 2201 | 557 if(s->flags2 & CODEC_FLAG2_FAST){ |
| 558 for(i=0;i<6;i++) { | |
| 559 if(cbp & 32) { | |
| 560 mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i); | |
| 561 } else { | |
| 562 s->block_last_index[i] = -1; | |
| 563 } | |
| 564 cbp+=cbp; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
565 } |
| 2201 | 566 }else{ |
| 567 cbp<<= 12-mb_block_count; | |
| 2967 | 568 |
| 2201 | 569 for(i=0;i<mb_block_count;i++) { |
| 570 if ( cbp & (1<<11) ) { | |
| 571 if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) | |
| 572 return -1; | |
| 573 } else { | |
| 574 s->block_last_index[i] = -1; | |
| 575 } | |
| 576 cbp+=cbp; | |
| 577 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
578 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
579 } else { |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
580 if(s->flags2 & CODEC_FLAG2_FAST){ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
581 for(i=0;i<6;i++) { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
582 if (cbp & 32) { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
583 mpeg1_fast_decode_block_inter(s, s->pblocks[i], i); |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
584 } else { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
585 s->block_last_index[i] = -1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
586 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
587 cbp+=cbp; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
588 } |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
589 }else{ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
590 for(i=0;i<6;i++) { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
591 if (cbp & 32) { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
592 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
593 return -1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
594 } else { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
595 s->block_last_index[i] = -1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
596 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
597 cbp+=cbp; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
598 } |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
599 } |
| 711 | 600 } |
| 601 }else{ | |
|
2947
18d47c6673f7
Mark all 12 block unused when there are no coded blocks
iive
parents:
2834
diff
changeset
|
602 for(i=0;i<12;i++) |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
603 s->block_last_index[i] = -1; |
| 0 | 604 } |
| 605 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
606 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
607 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= mb_type; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
608 |
| 0 | 609 return 0; |
| 610 } | |
| 611 | |
| 612 /* as h263, but only 17 codes */ | |
| 613 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) | |
| 614 { | |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
615 int code, sign, val, l, shift; |
| 0 | 616 |
| 545 | 617 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
618 if (code == 0) { |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
619 return pred; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
620 } |
| 0 | 621 if (code < 0) { |
| 622 return 0xffff; | |
| 623 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
624 |
| 21 | 625 sign = get_bits1(&s->gb); |
| 0 | 626 shift = fcode - 1; |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
627 val = code; |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
628 if (shift) { |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
629 val = (val - 1) << shift; |
| 0 | 630 val |= get_bits(&s->gb, shift); |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
631 val++; |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
632 } |
| 0 | 633 if (sign) |
| 634 val = -val; | |
| 635 val += pred; | |
| 2967 | 636 |
| 0 | 637 /* modulo decoding */ |
| 2093 | 638 l= INT_BIT - 5 - shift; |
| 639 val = (val<<l)>>l; | |
| 0 | 640 return val; |
| 641 } | |
| 642 | |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
643 static inline int decode_dc(GetBitContext *gb, int component) |
| 0 | 644 { |
| 645 int code, diff; | |
| 646 | |
| 647 if (component == 0) { | |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
648 code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2); |
| 0 | 649 } else { |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
650 code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2); |
| 0 | 651 } |
| 568 | 652 if (code < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
653 av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n"); |
| 0 | 654 return 0xffff; |
| 568 | 655 } |
| 0 | 656 if (code == 0) { |
| 657 diff = 0; | |
| 658 } else { | |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
659 diff = get_xbits(gb, code); |
| 0 | 660 } |
| 661 return diff; | |
| 662 } | |
| 663 | |
| 2967 | 664 static inline int mpeg1_decode_block_intra(MpegEncContext *s, |
| 665 DCTELEM *block, | |
| 0 | 666 int n) |
| 667 { | |
| 668 int level, dc, diff, i, j, run; | |
| 711 | 669 int component; |
| 5210 | 670 RLTable *rl = &ff_rl_mpeg1; |
| 1064 | 671 uint8_t * const scantable= s->intra_scantable.permutated; |
| 672 const uint16_t *quant_matrix= s->intra_matrix; | |
| 711 | 673 const int qscale= s->qscale; |
| 0 | 674 |
| 711 | 675 /* DC coef */ |
| 676 component = (n <= 3 ? 0 : n - 4 + 1); | |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
677 diff = decode_dc(&s->gb, component); |
| 711 | 678 if (diff >= 0xffff) |
| 679 return -1; | |
| 680 dc = s->last_dc[component]; | |
| 681 dc += diff; | |
| 682 s->last_dc[component] = dc; | |
| 683 block[0] = dc<<3; | |
| 4652 | 684 dprintf(s->avctx, "dc=%d diff=%d\n", dc, diff); |
| 711 | 685 i = 0; |
| 686 { | |
| 2967 | 687 OPEN_READER(re, &s->gb); |
| 711 | 688 /* now quantify & encode AC coefs */ |
| 689 for(;;) { | |
| 690 UPDATE_CACHE(re, &s->gb); | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2591
diff
changeset
|
691 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
| 2967 | 692 |
| 711 | 693 if(level == 127){ |
| 694 break; | |
| 695 } else if(level != 0) { | |
| 696 i += run; | |
| 697 j = scantable[i]; | |
| 1728 | 698 level= (level*qscale*quant_matrix[j])>>4; |
| 711 | 699 level= (level-1)|1; |
| 700 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 701 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 702 } else { | |
| 703 /* escape */ | |
| 704 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 705 UPDATE_CACHE(re, &s->gb); | |
| 706 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | |
| 707 if (level == -128) { | |
| 708 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); | |
| 709 } else if (level == 0) { | |
| 710 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); | |
| 711 } | |
| 712 i += run; | |
| 713 j = scantable[i]; | |
| 714 if(level<0){ | |
| 715 level= -level; | |
| 1728 | 716 level= (level*qscale*quant_matrix[j])>>4; |
| 711 | 717 level= (level-1)|1; |
| 718 level= -level; | |
| 719 }else{ | |
| 1728 | 720 level= (level*qscale*quant_matrix[j])>>4; |
| 711 | 721 level= (level-1)|1; |
| 722 } | |
| 723 } | |
| 724 if (i > 63){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
725 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
| 711 | 726 return -1; |
| 727 } | |
| 728 | |
| 729 block[j] = level; | |
| 730 } | |
| 731 CLOSE_READER(re, &s->gb); | |
| 732 } | |
| 733 s->block_last_index[n] = i; | |
| 734 return 0; | |
| 735 } | |
| 736 | |
| 2967 | 737 static inline int mpeg1_decode_block_inter(MpegEncContext *s, |
| 738 DCTELEM *block, | |
| 711 | 739 int n) |
| 740 { | |
| 741 int level, i, j, run; | |
| 5210 | 742 RLTable *rl = &ff_rl_mpeg1; |
| 1064 | 743 uint8_t * const scantable= s->intra_scantable.permutated; |
| 744 const uint16_t *quant_matrix= s->inter_matrix; | |
| 711 | 745 const int qscale= s->qscale; |
| 746 | |
| 747 { | |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
748 OPEN_READER(re, &s->gb); |
| 711 | 749 i = -1; |
| 0 | 750 /* special case for the first coef. no need to add a second vlc table */ |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
751 UPDATE_CACHE(re, &s->gb); |
| 2617 | 752 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { |
| 1728 | 753 level= (3*qscale*quant_matrix[0])>>5; |
| 711 | 754 level= (level-1)|1; |
| 2617 | 755 if(GET_CACHE(re, &s->gb)&0x40000000) |
| 711 | 756 level= -level; |
| 714 | 757 block[0] = level; |
| 711 | 758 i++; |
| 2617 | 759 SKIP_BITS(re, &s->gb, 2); |
| 760 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 761 goto end; | |
| 0 | 762 } |
| 714 | 763 |
| 711 | 764 /* now quantify & encode AC coefs */ |
| 765 for(;;) { | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2591
diff
changeset
|
766 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
| 2967 | 767 |
| 2617 | 768 if(level != 0) { |
| 711 | 769 i += run; |
| 770 j = scantable[i]; | |
| 1728 | 771 level= ((level*2+1)*qscale*quant_matrix[j])>>5; |
| 711 | 772 level= (level-1)|1; |
| 773 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 2617 | 774 SKIP_BITS(re, &s->gb, 1); |
| 711 | 775 } else { |
| 776 /* escape */ | |
| 777 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 778 UPDATE_CACHE(re, &s->gb); | |
| 779 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | |
| 780 if (level == -128) { | |
| 2617 | 781 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); |
| 711 | 782 } else if (level == 0) { |
| 2617 | 783 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); |
| 711 | 784 } |
| 785 i += run; | |
| 786 j = scantable[i]; | |
| 787 if(level<0){ | |
| 788 level= -level; | |
| 1728 | 789 level= ((level*2+1)*qscale*quant_matrix[j])>>5; |
| 711 | 790 level= (level-1)|1; |
| 791 level= -level; | |
| 792 }else{ | |
| 1728 | 793 level= ((level*2+1)*qscale*quant_matrix[j])>>5; |
| 711 | 794 level= (level-1)|1; |
| 795 } | |
| 796 } | |
| 797 if (i > 63){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
798 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
| 711 | 799 return -1; |
| 800 } | |
| 0 | 801 |
| 711 | 802 block[j] = level; |
| 2617 | 803 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) |
| 804 break; | |
| 805 UPDATE_CACHE(re, &s->gb); | |
| 0 | 806 } |
| 2617 | 807 end: |
| 808 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 711 | 809 CLOSE_READER(re, &s->gb); |
| 0 | 810 } |
| 711 | 811 s->block_last_index[n] = i; |
| 0 | 812 return 0; |
| 813 } | |
| 814 | |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
815 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n) |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
816 { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
817 int level, i, j, run; |
| 5210 | 818 RLTable *rl = &ff_rl_mpeg1; |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
819 uint8_t * const scantable= s->intra_scantable.permutated; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
820 const int qscale= s->qscale; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
821 |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
822 { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
823 OPEN_READER(re, &s->gb); |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
824 i = -1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
825 /* special case for the first coef. no need to add a second vlc table */ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
826 UPDATE_CACHE(re, &s->gb); |
| 2617 | 827 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { |
| 2203 | 828 level= (3*qscale)>>1; |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
829 level= (level-1)|1; |
| 2617 | 830 if(GET_CACHE(re, &s->gb)&0x40000000) |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
831 level= -level; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
832 block[0] = level; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
833 i++; |
| 2617 | 834 SKIP_BITS(re, &s->gb, 2); |
| 835 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 836 goto end; | |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
837 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
838 |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
839 /* now quantify & encode AC coefs */ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
840 for(;;) { |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2591
diff
changeset
|
841 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
| 2967 | 842 |
| 2617 | 843 if(level != 0) { |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
844 i += run; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
845 j = scantable[i]; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
846 level= ((level*2+1)*qscale)>>1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
847 level= (level-1)|1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
848 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); |
| 2617 | 849 SKIP_BITS(re, &s->gb, 1); |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
850 } else { |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
851 /* escape */ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
852 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
853 UPDATE_CACHE(re, &s->gb); |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
854 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
855 if (level == -128) { |
| 2617 | 856 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
857 } else if (level == 0) { |
| 2617 | 858 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
859 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
860 i += run; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
861 j = scantable[i]; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
862 if(level<0){ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
863 level= -level; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
864 level= ((level*2+1)*qscale)>>1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
865 level= (level-1)|1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
866 level= -level; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
867 }else{ |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
868 level= ((level*2+1)*qscale)>>1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
869 level= (level-1)|1; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
870 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
871 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
872 |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
873 block[j] = level; |
| 2617 | 874 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) |
| 875 break; | |
| 876 UPDATE_CACHE(re, &s->gb); | |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
877 } |
| 2617 | 878 end: |
| 879 LAST_SKIP_BITS(re, &s->gb, 2); | |
|
2202
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
880 CLOSE_READER(re, &s->gb); |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
881 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
882 s->block_last_index[n] = i; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
883 return 0; |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
884 } |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
885 |
|
8079b177ff5c
optional non spec compliant optimizations for mpeg1
michael
parents:
2201
diff
changeset
|
886 |
| 2967 | 887 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, |
| 888 DCTELEM *block, | |
| 714 | 889 int n) |
| 0 | 890 { |
| 891 int level, i, j, run; | |
| 5210 | 892 RLTable *rl = &ff_rl_mpeg1; |
| 1064 | 893 uint8_t * const scantable= s->intra_scantable.permutated; |
| 894 const uint16_t *quant_matrix; | |
| 714 | 895 const int qscale= s->qscale; |
| 0 | 896 int mismatch; |
| 897 | |
| 898 mismatch = 1; | |
| 899 | |
| 900 { | |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
901 OPEN_READER(re, &s->gb); |
| 714 | 902 i = -1; |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
903 if (n < 4) |
| 714 | 904 quant_matrix = s->inter_matrix; |
| 0 | 905 else |
| 714 | 906 quant_matrix = s->chroma_inter_matrix; |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
907 |
| 0 | 908 /* special case for the first coef. no need to add a second vlc table */ |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
909 UPDATE_CACHE(re, &s->gb); |
| 2617 | 910 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { |
| 714 | 911 level= (3*qscale*quant_matrix[0])>>5; |
| 2617 | 912 if(GET_CACHE(re, &s->gb)&0x40000000) |
| 714 | 913 level= -level; |
| 914 block[0] = level; | |
| 915 mismatch ^= level; | |
| 916 i++; | |
| 2617 | 917 SKIP_BITS(re, &s->gb, 2); |
| 918 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 919 goto end; | |
| 714 | 920 } |
| 921 | |
| 922 /* now quantify & encode AC coefs */ | |
| 923 for(;;) { | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2591
diff
changeset
|
924 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
| 2967 | 925 |
| 2617 | 926 if(level != 0) { |
| 714 | 927 i += run; |
| 928 j = scantable[i]; | |
| 929 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 930 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 2617 | 931 SKIP_BITS(re, &s->gb, 1); |
| 714 | 932 } else { |
| 933 /* escape */ | |
| 934 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 935 UPDATE_CACHE(re, &s->gb); | |
| 936 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 937 | |
| 938 i += run; | |
| 939 j = scantable[i]; | |
| 940 if(level<0){ | |
| 941 level= ((-level*2+1)*qscale*quant_matrix[j])>>5; | |
| 942 level= -level; | |
| 943 }else{ | |
| 944 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 945 } | |
| 946 } | |
| 947 if (i > 63){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
948 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
| 714 | 949 return -1; |
| 950 } | |
| 2967 | 951 |
| 714 | 952 mismatch ^= level; |
| 953 block[j] = level; | |
| 2617 | 954 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) |
| 955 break; | |
| 956 UPDATE_CACHE(re, &s->gb); | |
| 0 | 957 } |
| 2617 | 958 end: |
| 959 LAST_SKIP_BITS(re, &s->gb, 2); | |
|
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
498
diff
changeset
|
960 CLOSE_READER(re, &s->gb); |
| 0 | 961 } |
| 962 block[63] ^= (mismatch & 1); | |
| 2967 | 963 |
| 0 | 964 s->block_last_index[n] = i; |
| 965 return 0; | |
| 966 } | |
| 967 | |
| 2967 | 968 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, |
| 969 DCTELEM *block, | |
| 2201 | 970 int n) |
| 971 { | |
| 972 int level, i, j, run; | |
| 5210 | 973 RLTable *rl = &ff_rl_mpeg1; |
| 2201 | 974 uint8_t * const scantable= s->intra_scantable.permutated; |
| 975 const int qscale= s->qscale; | |
| 976 OPEN_READER(re, &s->gb); | |
| 977 i = -1; | |
| 978 | |
| 979 /* special case for the first coef. no need to add a second vlc table */ | |
| 980 UPDATE_CACHE(re, &s->gb); | |
| 2617 | 981 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { |
| 2201 | 982 level= (3*qscale)>>1; |
| 2617 | 983 if(GET_CACHE(re, &s->gb)&0x40000000) |
| 2201 | 984 level= -level; |
| 985 block[0] = level; | |
| 986 i++; | |
| 2617 | 987 SKIP_BITS(re, &s->gb, 2); |
| 988 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 989 goto end; | |
| 2201 | 990 } |
| 991 | |
| 992 /* now quantify & encode AC coefs */ | |
| 993 for(;;) { | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2591
diff
changeset
|
994 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
| 2967 | 995 |
| 2617 | 996 if(level != 0) { |
| 2201 | 997 i += run; |
| 998 j = scantable[i]; | |
| 999 level= ((level*2+1)*qscale)>>1; | |
| 1000 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 2617 | 1001 SKIP_BITS(re, &s->gb, 1); |
| 2201 | 1002 } else { |
| 1003 /* escape */ | |
| 1004 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1005 UPDATE_CACHE(re, &s->gb); | |
| 1006 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1007 | |
| 1008 i += run; | |
| 1009 j = scantable[i]; | |
| 1010 if(level<0){ | |
| 1011 level= ((-level*2+1)*qscale)>>1; | |
| 1012 level= -level; | |
| 1013 }else{ | |
| 1014 level= ((level*2+1)*qscale)>>1; | |
| 1015 } | |
| 1016 } | |
| 2967 | 1017 |
| 2201 | 1018 block[j] = level; |
| 2617 | 1019 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) |
| 1020 break; | |
| 1021 UPDATE_CACHE(re, &s->gb); | |
| 2201 | 1022 } |
| 2617 | 1023 end: |
| 2967 | 1024 LAST_SKIP_BITS(re, &s->gb, 2); |
| 2201 | 1025 CLOSE_READER(re, &s->gb); |
| 1026 s->block_last_index[n] = i; | |
| 1027 return 0; | |
| 1028 } | |
| 1029 | |
| 1030 | |
| 2967 | 1031 static inline int mpeg2_decode_block_intra(MpegEncContext *s, |
| 1032 DCTELEM *block, | |
| 714 | 1033 int n) |
| 0 | 1034 { |
| 1035 int level, dc, diff, i, j, run; | |
| 714 | 1036 int component; |
| 0 | 1037 RLTable *rl; |
| 1064 | 1038 uint8_t * const scantable= s->intra_scantable.permutated; |
| 1039 const uint16_t *quant_matrix; | |
| 714 | 1040 const int qscale= s->qscale; |
| 0 | 1041 int mismatch; |
| 1042 | |
| 1043 /* DC coef */ | |
| 714 | 1044 if (n < 4){ |
| 1045 quant_matrix = s->intra_matrix; | |
| 2967 | 1046 component = 0; |
| 714 | 1047 }else{ |
| 1048 quant_matrix = s->chroma_intra_matrix; | |
|
1848
c72589baee53
initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents:
1841
diff
changeset
|
1049 component = (n&1) + 1; |
| 714 | 1050 } |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
1051 diff = decode_dc(&s->gb, component); |
| 0 | 1052 if (diff >= 0xffff) |
| 1053 return -1; | |
| 1054 dc = s->last_dc[component]; | |
| 1055 dc += diff; | |
| 1056 s->last_dc[component] = dc; | |
| 1057 block[0] = dc << (3 - s->intra_dc_precision); | |
| 4652 | 1058 dprintf(s->avctx, "dc=%d\n", block[0]); |
|
58
0e0a24def67a
fixed last zero mv for field - fixed mismatch handling for intra coefs
glantau
parents:
54
diff
changeset
|
1059 mismatch = block[0] ^ 1; |
| 714 | 1060 i = 0; |
| 0 | 1061 if (s->intra_vlc_format) |
| 5210 | 1062 rl = &ff_rl_mpeg2; |
| 0 | 1063 else |
| 5210 | 1064 rl = &ff_rl_mpeg1; |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1065 |
| 714 | 1066 { |
| 2967 | 1067 OPEN_READER(re, &s->gb); |
| 714 | 1068 /* now quantify & encode AC coefs */ |
| 1069 for(;;) { | |
| 1070 UPDATE_CACHE(re, &s->gb); | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2591
diff
changeset
|
1071 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
| 2967 | 1072 |
| 714 | 1073 if(level == 127){ |
| 1074 break; | |
| 1075 } else if(level != 0) { | |
| 1076 i += run; | |
| 1077 j = scantable[i]; | |
| 1078 level= (level*qscale*quant_matrix[j])>>4; | |
| 1079 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1080 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 1081 } else { | |
| 1082 /* escape */ | |
| 1083 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1084 UPDATE_CACHE(re, &s->gb); | |
| 1085 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1086 i += run; | |
| 1087 j = scantable[i]; | |
| 1088 if(level<0){ | |
| 1089 level= (-level*qscale*quant_matrix[j])>>4; | |
| 1090 level= -level; | |
| 1091 }else{ | |
| 1092 level= (level*qscale*quant_matrix[j])>>4; | |
| 1093 } | |
| 1094 } | |
| 1095 if (i > 63){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1096 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
| 714 | 1097 return -1; |
| 1098 } | |
| 2967 | 1099 |
| 714 | 1100 mismatch^= level; |
| 1101 block[j] = level; | |
| 568 | 1102 } |
| 714 | 1103 CLOSE_READER(re, &s->gb); |
| 0 | 1104 } |
| 714 | 1105 block[63]^= mismatch&1; |
| 2967 | 1106 |
| 0 | 1107 s->block_last_index[n] = i; |
| 1108 return 0; | |
| 1109 } | |
| 1110 | |
| 2967 | 1111 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, |
| 1112 DCTELEM *block, | |
| 2622 | 1113 int n) |
| 1114 { | |
| 1115 int level, dc, diff, j, run; | |
| 1116 int component; | |
| 1117 RLTable *rl; | |
| 1118 uint8_t * scantable= s->intra_scantable.permutated; | |
| 1119 const uint16_t *quant_matrix; | |
| 1120 const int qscale= s->qscale; | |
| 1121 | |
| 1122 /* DC coef */ | |
| 1123 if (n < 4){ | |
| 1124 quant_matrix = s->intra_matrix; | |
| 2967 | 1125 component = 0; |
| 2622 | 1126 }else{ |
| 1127 quant_matrix = s->chroma_intra_matrix; | |
| 1128 component = (n&1) + 1; | |
| 1129 } | |
| 1130 diff = decode_dc(&s->gb, component); | |
| 1131 if (diff >= 0xffff) | |
| 1132 return -1; | |
| 1133 dc = s->last_dc[component]; | |
| 1134 dc += diff; | |
| 1135 s->last_dc[component] = dc; | |
| 1136 block[0] = dc << (3 - s->intra_dc_precision); | |
| 1137 if (s->intra_vlc_format) | |
| 5210 | 1138 rl = &ff_rl_mpeg2; |
| 2622 | 1139 else |
| 5210 | 1140 rl = &ff_rl_mpeg1; |
| 2622 | 1141 |
| 1142 { | |
| 2967 | 1143 OPEN_READER(re, &s->gb); |
| 2622 | 1144 /* now quantify & encode AC coefs */ |
| 1145 for(;;) { | |
| 1146 UPDATE_CACHE(re, &s->gb); | |
| 1147 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 2967 | 1148 |
| 2622 | 1149 if(level == 127){ |
| 1150 break; | |
| 1151 } else if(level != 0) { | |
| 1152 scantable += run; | |
| 1153 j = *scantable; | |
| 1154 level= (level*qscale*quant_matrix[j])>>4; | |
| 1155 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1156 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 1157 } else { | |
| 1158 /* escape */ | |
| 1159 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1160 UPDATE_CACHE(re, &s->gb); | |
| 1161 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1162 scantable += run; | |
| 1163 j = *scantable; | |
| 1164 if(level<0){ | |
| 1165 level= (-level*qscale*quant_matrix[j])>>4; | |
| 1166 level= -level; | |
| 1167 }else{ | |
| 1168 level= (level*qscale*quant_matrix[j])>>4; | |
| 1169 } | |
| 1170 } | |
| 2967 | 1171 |
| 2622 | 1172 block[j] = level; |
| 1173 } | |
| 1174 CLOSE_READER(re, &s->gb); | |
| 1175 } | |
| 2967 | 1176 |
| 2622 | 1177 s->block_last_index[n] = scantable - s->intra_scantable.permutated; |
| 1178 return 0; | |
| 1179 } | |
| 1180 | |
| 0 | 1181 typedef struct Mpeg1Context { |
| 1182 MpegEncContext mpeg_enc_ctx; | |
| 1183 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ | |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
1184 int repeat_field; /* true if we must repeat the field */ |
| 1546 | 1185 AVPanScan pan_scan; /** some temporary storage for the panscan */ |
| 1827 | 1186 int slice_count; |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1187 int swap_uv;//indicate VCR2 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1188 int save_aspect_info; |
|
4888
185f5e4feb72
make mpeg decoder handle mid-stream changes in resolution
benoit
parents:
4795
diff
changeset
|
1189 int save_width, save_height; |
| 2219 | 1190 AVRational frame_rate_ext; ///< MPEG-2 specific framerate modificator |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1191 |
| 0 | 1192 } Mpeg1Context; |
| 1193 | |
| 1194 static int mpeg_decode_init(AVCodecContext *avctx) | |
| 1195 { | |
| 1196 Mpeg1Context *s = avctx->priv_data; | |
| 1892 | 1197 MpegEncContext *s2 = &s->mpeg_enc_ctx; |
| 1990 | 1198 int i; |
| 2967 | 1199 |
| 1990 | 1200 //we need some parmutation to store |
| 1201 //matrixes, until MPV_common_init() | |
| 2967 | 1202 //set the real permutatuon |
| 1990 | 1203 for(i=0;i<64;i++) |
| 1204 s2->dsp.idct_permutation[i]=i; | |
| 1205 | |
| 1892 | 1206 MPV_decode_defaults(s2); |
| 2967 | 1207 |
|
1732
f716b8f47d98
uninitalized variables fix by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
1728
diff
changeset
|
1208 s->mpeg_enc_ctx.avctx= avctx; |
| 558 | 1209 s->mpeg_enc_ctx.flags= avctx->flags; |
|
1754
bdf3927bf8c5
closed gop support & flags2 as all bits in flags are used
michael
parents:
1749
diff
changeset
|
1210 s->mpeg_enc_ctx.flags2= avctx->flags2; |
| 5210 | 1211 ff_mpeg12_common_init(&s->mpeg_enc_ctx); |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
1212 init_vlcs(); |
| 0 | 1213 |
| 1214 s->mpeg_enc_ctx_allocated = 0; | |
| 1215 s->mpeg_enc_ctx.picture_number = 0; | |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
1216 s->repeat_field = 0; |
| 344 | 1217 s->mpeg_enc_ctx.codec_id= avctx->codec->id; |
| 0 | 1218 return 0; |
| 1219 } | |
| 1220 | |
| 2967 | 1221 static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm, |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1222 const uint8_t *new_perm){ |
| 2219 | 1223 uint16_t temp_matrix[64]; |
| 1224 int i; | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1225 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1226 memcpy(temp_matrix,matrix,64*sizeof(uint16_t)); |
| 2967 | 1227 |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1228 for(i=0;i<64;i++){ |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1229 matrix[new_perm[i]] = temp_matrix[old_perm[i]]; |
| 2967 | 1230 } |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1231 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1232 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1233 //Call this function when we know all parameters |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1234 //it may be called in different places for mpeg1 and mpeg2 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1235 static int mpeg_decode_postinit(AVCodecContext *avctx){ |
| 2219 | 1236 Mpeg1Context *s1 = avctx->priv_data; |
| 1237 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 1238 uint8_t old_permutation[64]; | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1239 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1240 if ( |
| 2979 | 1241 (s1->mpeg_enc_ctx_allocated == 0)|| |
| 2270 | 1242 avctx->coded_width != s->width || |
| 1243 avctx->coded_height != s->height|| | |
|
4888
185f5e4feb72
make mpeg decoder handle mid-stream changes in resolution
benoit
parents:
4795
diff
changeset
|
1244 s1->save_width != s->width || |
|
185f5e4feb72
make mpeg decoder handle mid-stream changes in resolution
benoit
parents:
4795
diff
changeset
|
1245 s1->save_height != s->height || |
| 2590 | 1246 s1->save_aspect_info != s->aspect_ratio_info|| |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1247 0) |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1248 { |
| 2967 | 1249 |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1250 if (s1->mpeg_enc_ctx_allocated) { |
| 2681 | 1251 ParseContext pc= s->parse_context; |
| 1252 s->parse_context.buffer=0; | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1253 MPV_common_end(s); |
| 2681 | 1254 s->parse_context= pc; |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1255 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1256 |
| 2979 | 1257 if( (s->width == 0 )||(s->height == 0)) |
| 1258 return -2; | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1259 |
| 2270 | 1260 avcodec_set_dimensions(avctx, s->width, s->height); |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1261 avctx->bit_rate = s->bit_rate; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1262 s1->save_aspect_info = s->aspect_ratio_info; |
|
4888
185f5e4feb72
make mpeg decoder handle mid-stream changes in resolution
benoit
parents:
4795
diff
changeset
|
1263 s1->save_width = s->width; |
|
185f5e4feb72
make mpeg decoder handle mid-stream changes in resolution
benoit
parents:
4795
diff
changeset
|
1264 s1->save_height = s->height; |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1265 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1266 //low_delay may be forced, in this case we will have B frames |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1267 //that behave like P frames |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1268 avctx->has_b_frames = !(s->low_delay); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1269 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1270 if(avctx->sub_id==1){//s->codec_id==avctx->codec_id==CODEC_ID |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1271 //mpeg1 fps |
|
3391
d60dc0a7dee6
staric frame_rate_tab -> non static ff_frame_rate_tab part of the cavs patch by (Stefan Gehrer stefan.gehrer gmx de)
michael
parents:
3309
diff
changeset
|
1272 avctx->time_base.den= ff_frame_rate_tab[s->frame_rate_index].num; |
|
d60dc0a7dee6
staric frame_rate_tab -> non static ff_frame_rate_tab part of the cavs patch by (Stefan Gehrer stefan.gehrer gmx de)
michael
parents:
3309
diff
changeset
|
1273 avctx->time_base.num= ff_frame_rate_tab[s->frame_rate_index].den; |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1274 //mpeg1 aspect |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1275 avctx->sample_aspect_ratio= av_d2q( |
| 5210 | 1276 1.0/ff_mpeg1_aspect[s->aspect_ratio_info], 255); |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1277 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1278 }else{//mpeg2 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1279 //mpeg2 fps |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1280 av_reduce( |
| 2967 | 1281 &s->avctx->time_base.den, |
| 1282 &s->avctx->time_base.num, | |
|
3391
d60dc0a7dee6
staric frame_rate_tab -> non static ff_frame_rate_tab part of the cavs patch by (Stefan Gehrer stefan.gehrer gmx de)
michael
parents:
3309
diff
changeset
|
1283 ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num, |
|
d60dc0a7dee6
staric frame_rate_tab -> non static ff_frame_rate_tab part of the cavs patch by (Stefan Gehrer stefan.gehrer gmx de)
michael
parents:
3309
diff
changeset
|
1284 ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den, |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1285 1<<30); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1286 //mpeg2 aspect |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1287 if(s->aspect_ratio_info > 1){ |
|
1891
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1288 if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) ){ |
| 2967 | 1289 s->avctx->sample_aspect_ratio= |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1290 av_div_q( |
| 5210 | 1291 ff_mpeg2_aspect[s->aspect_ratio_info], |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1292 (AVRational){s->width, s->height} |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1293 ); |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1294 }else{ |
| 2967 | 1295 s->avctx->sample_aspect_ratio= |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1296 av_div_q( |
| 5210 | 1297 ff_mpeg2_aspect[s->aspect_ratio_info], |
|
1891
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1298 (AVRational){s1->pan_scan.width, s1->pan_scan.height} |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1299 ); |
| 2979 | 1300 } |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1301 }else{ |
| 2967 | 1302 s->avctx->sample_aspect_ratio= |
| 5210 | 1303 ff_mpeg2_aspect[s->aspect_ratio_info]; |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1304 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1305 }//mpeg2 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1306 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1307 if(avctx->xvmc_acceleration){ |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1308 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1309 }else{ |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1310 if(s->chroma_format < 2){ |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1311 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1312 }else |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1313 if(s->chroma_format == 2){ |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1314 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_422); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1315 }else |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1316 if(s->chroma_format > 2){ |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1317 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_444); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1318 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1319 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1320 //until then pix_fmt may be changed right after codec init |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1321 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT ) |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1322 if( avctx->idct_algo == FF_IDCT_AUTO ) |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1323 avctx->idct_algo = FF_IDCT_SIMPLE; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1324 |
| 2967 | 1325 //quantization matrixes may need reordering |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1326 //if dct permutation is changed |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1327 memcpy(old_permutation,s->dsp.idct_permutation,64*sizeof(uint8_t)); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1328 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1329 if (MPV_common_init(s) < 0) |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1330 return -2; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1331 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1332 quant_matrix_rebuild(s->intra_matrix, old_permutation,s->dsp.idct_permutation); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1333 quant_matrix_rebuild(s->inter_matrix, old_permutation,s->dsp.idct_permutation); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1334 quant_matrix_rebuild(s->chroma_intra_matrix,old_permutation,s->dsp.idct_permutation); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1335 quant_matrix_rebuild(s->chroma_inter_matrix,old_permutation,s->dsp.idct_permutation); |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1336 |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1337 s1->mpeg_enc_ctx_allocated = 1; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1338 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1339 return 0; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1340 } |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1341 |
| 2967 | 1342 static int mpeg1_decode_picture(AVCodecContext *avctx, |
| 1862 | 1343 const uint8_t *buf, int buf_size) |
| 0 | 1344 { |
| 1345 Mpeg1Context *s1 = avctx->priv_data; | |
| 1346 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 1697 | 1347 int ref, f_code, vbv_delay; |
| 0 | 1348 |
| 2967 | 1349 if(mpeg_decode_postinit(s->avctx) < 0) |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1350 return -2; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1351 |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1021
diff
changeset
|
1352 init_get_bits(&s->gb, buf, buf_size*8); |
| 0 | 1353 |
| 1354 ref = get_bits(&s->gb, 10); /* temporal ref */ | |
| 1355 s->pict_type = get_bits(&s->gb, 3); | |
| 2575 | 1356 if(s->pict_type == 0 || s->pict_type > 3) |
| 1357 return -1; | |
| 872 | 1358 |
| 1697 | 1359 vbv_delay= get_bits(&s->gb, 16); |
| 0 | 1360 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { |
| 21 | 1361 s->full_pel[0] = get_bits1(&s->gb); |
| 0 | 1362 f_code = get_bits(&s->gb, 3); |
| 2786 | 1363 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) |
| 0 | 1364 return -1; |
| 1365 s->mpeg_f_code[0][0] = f_code; | |
| 1366 s->mpeg_f_code[0][1] = f_code; | |
| 1367 } | |
| 1368 if (s->pict_type == B_TYPE) { | |
| 21 | 1369 s->full_pel[1] = get_bits1(&s->gb); |
| 0 | 1370 f_code = get_bits(&s->gb, 3); |
| 2786 | 1371 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) |
| 0 | 1372 return -1; |
| 1373 s->mpeg_f_code[1][0] = f_code; | |
| 1374 s->mpeg_f_code[1][1] = f_code; | |
| 1375 } | |
| 903 | 1376 s->current_picture.pict_type= s->pict_type; |
| 1377 s->current_picture.key_frame= s->pict_type == I_TYPE; | |
| 2967 | 1378 |
| 2575 | 1379 if(avctx->debug & FF_DEBUG_PICT_INFO) |
| 1380 av_log(avctx, AV_LOG_DEBUG, "vbv_delay %d, ref %d type:%d\n", vbv_delay, ref, s->pict_type); | |
| 2967 | 1381 |
| 0 | 1382 s->y_dc_scale = 8; |
| 1383 s->c_dc_scale = 8; | |
| 1384 s->first_slice = 1; | |
| 1385 return 0; | |
| 1386 } | |
| 1387 | |
| 2219 | 1388 static void mpeg_decode_sequence_extension(Mpeg1Context *s1) |
| 0 | 1389 { |
| 2219 | 1390 MpegEncContext *s= &s1->mpeg_enc_ctx; |
| 0 | 1391 int horiz_size_ext, vert_size_ext; |
| 1721 | 1392 int bit_rate_ext; |
| 0 | 1393 |
| 1421 | 1394 skip_bits(&s->gb, 1); /* profil and level esc*/ |
| 2167 | 1395 s->avctx->profile= get_bits(&s->gb, 3); |
| 1396 s->avctx->level= get_bits(&s->gb, 4); | |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
1397 s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ |
|
1848
c72589baee53
initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents:
1841
diff
changeset
|
1398 s->chroma_format = get_bits(&s->gb, 2); /* chroma_format 1=420, 2=422, 3=444 */ |
| 0 | 1399 horiz_size_ext = get_bits(&s->gb, 2); |
| 1400 vert_size_ext = get_bits(&s->gb, 2); | |
| 1401 s->width |= (horiz_size_ext << 12); | |
| 1402 s->height |= (vert_size_ext << 12); | |
| 1403 bit_rate_ext = get_bits(&s->gb, 12); /* XXX: handle it */ | |
| 2540 | 1404 s->bit_rate += (bit_rate_ext << 18) * 400; |
| 21 | 1405 skip_bits1(&s->gb); /* marker */ |
|
1710
4a68b20eeb2c
print vbv buffer size & bitrate when decoding with -debug 1
michael
parents:
1708
diff
changeset
|
1406 s->avctx->rc_buffer_size += get_bits(&s->gb, 8)*1024*16<<10; |
| 1346 | 1407 |
| 917 | 1408 s->low_delay = get_bits1(&s->gb); |
| 1346 | 1409 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1; |
| 1410 | |
| 2219 | 1411 s1->frame_rate_ext.num = get_bits(&s->gb, 2)+1; |
| 1412 s1->frame_rate_ext.den = get_bits(&s->gb, 5)+1; | |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
1413 |
| 4652 | 1414 dprintf(s->avctx, "sequence extension\n"); |
| 1421 | 1415 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; |
|
401
e20655449d4a
mpeg1/2 identifier - fixed frame rate for some bad mpeg1 streams
glantau
parents:
391
diff
changeset
|
1416 s->avctx->sub_id = 2; /* indicates mpeg2 found */ |
| 917 | 1417 |
| 1421 | 1418 if(s->avctx->debug & FF_DEBUG_PICT_INFO) |
| 2967 | 1419 av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n", |
| 2167 | 1420 s->avctx->profile, s->avctx->level, s->avctx->rc_buffer_size, s->bit_rate); |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1421 |
| 0 | 1422 } |
| 1423 | |
| 1546 | 1424 static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1) |
| 1425 { | |
| 1426 MpegEncContext *s= &s1->mpeg_enc_ctx; | |
| 1427 int color_description, w, h; | |
| 1428 | |
| 1429 skip_bits(&s->gb, 3); /* video format */ | |
| 1430 color_description= get_bits1(&s->gb); | |
| 1431 if(color_description){ | |
| 1432 skip_bits(&s->gb, 8); /* color primaries */ | |
| 1433 skip_bits(&s->gb, 8); /* transfer_characteristics */ | |
| 1434 skip_bits(&s->gb, 8); /* matrix_coefficients */ | |
| 1435 } | |
| 1436 w= get_bits(&s->gb, 14); | |
| 1437 skip_bits(&s->gb, 1); //marker | |
| 1438 h= get_bits(&s->gb, 14); | |
| 1439 skip_bits(&s->gb, 1); //marker | |
| 2967 | 1440 |
| 1546 | 1441 s1->pan_scan.width= 16*w; |
| 1442 s1->pan_scan.height=16*h; | |
| 2967 | 1443 |
| 1546 | 1444 if(s->avctx->debug & FF_DEBUG_PICT_INFO) |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1445 av_log(s->avctx, AV_LOG_DEBUG, "sde w:%d, h:%d\n", w, h); |
| 1546 | 1446 } |
| 1447 | |
| 1448 static void mpeg_decode_picture_display_extension(Mpeg1Context *s1) | |
| 1449 { | |
| 1450 MpegEncContext *s= &s1->mpeg_enc_ctx; | |
|
1891
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1451 int i,nofco; |
| 1546 | 1452 |
|
1891
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1453 nofco = 1; |
|
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1454 if(s->progressive_sequence){ |
|
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1455 if(s->repeat_first_field){ |
| 2979 | 1456 nofco++; |
| 1457 if(s->top_field_first) | |
| 1458 nofco++; | |
| 1459 } | |
|
1891
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1460 }else{ |
|
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1461 if(s->picture_structure == PICT_FRAME){ |
|
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1462 nofco++; |
| 2979 | 1463 if(s->repeat_first_field) |
| 1464 nofco++; | |
| 1465 } | |
|
1891
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1466 } |
|
f403b3e286b3
use pan_scan to remove some weight, proper pan_scan offset reading
iive
parents:
1890
diff
changeset
|
1467 for(i=0; i<nofco; i++){ |
| 1546 | 1468 s1->pan_scan.position[i][0]= get_sbits(&s->gb, 16); |
| 1469 skip_bits(&s->gb, 1); //marker | |
| 1470 s1->pan_scan.position[i][1]= get_sbits(&s->gb, 16); | |
| 1471 skip_bits(&s->gb, 1); //marker | |
| 1472 } | |
| 2967 | 1473 |
| 1546 | 1474 if(s->avctx->debug & FF_DEBUG_PICT_INFO) |
| 2967 | 1475 av_log(s->avctx, AV_LOG_DEBUG, "pde (%d,%d) (%d,%d) (%d,%d)\n", |
| 1476 s1->pan_scan.position[0][0], s1->pan_scan.position[0][1], | |
| 1477 s1->pan_scan.position[1][0], s1->pan_scan.position[1][1], | |
| 1546 | 1478 s1->pan_scan.position[2][0], s1->pan_scan.position[2][1] |
| 1479 ); | |
| 1480 } | |
| 1481 | |
| 0 | 1482 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) |
| 1483 { | |
|
38
5bf15419d47e
changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents:
21
diff
changeset
|
1484 int i, v, j; |
| 0 | 1485 |
| 4652 | 1486 dprintf(s->avctx, "matrix extension\n"); |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1487 |
| 21 | 1488 if (get_bits1(&s->gb)) { |
| 0 | 1489 for(i=0;i<64;i++) { |
| 1490 v = get_bits(&s->gb, 8); | |
| 1092 | 1491 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
38
5bf15419d47e
changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents:
21
diff
changeset
|
1492 s->intra_matrix[j] = v; |
|
5bf15419d47e
changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents:
21
diff
changeset
|
1493 s->chroma_intra_matrix[j] = v; |
| 0 | 1494 } |
| 1495 } | |
| 21 | 1496 if (get_bits1(&s->gb)) { |
| 0 | 1497 for(i=0;i<64;i++) { |
| 1498 v = get_bits(&s->gb, 8); | |
| 1092 | 1499 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
| 344 | 1500 s->inter_matrix[j] = v; |
| 1501 s->chroma_inter_matrix[j] = v; | |
| 0 | 1502 } |
| 1503 } | |
| 21 | 1504 if (get_bits1(&s->gb)) { |
| 0 | 1505 for(i=0;i<64;i++) { |
| 1506 v = get_bits(&s->gb, 8); | |
| 1092 | 1507 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
38
5bf15419d47e
changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents:
21
diff
changeset
|
1508 s->chroma_intra_matrix[j] = v; |
| 0 | 1509 } |
| 1510 } | |
| 21 | 1511 if (get_bits1(&s->gb)) { |
| 0 | 1512 for(i=0;i<64;i++) { |
| 1513 v = get_bits(&s->gb, 8); | |
| 1092 | 1514 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
| 344 | 1515 s->chroma_inter_matrix[j] = v; |
| 0 | 1516 } |
| 1517 } | |
| 1518 } | |
| 1519 | |
| 1520 static void mpeg_decode_picture_coding_extension(MpegEncContext *s) | |
| 1521 { | |
| 1522 s->full_pel[0] = s->full_pel[1] = 0; | |
| 1523 s->mpeg_f_code[0][0] = get_bits(&s->gb, 4); | |
| 1524 s->mpeg_f_code[0][1] = get_bits(&s->gb, 4); | |
| 1525 s->mpeg_f_code[1][0] = get_bits(&s->gb, 4); | |
| 1526 s->mpeg_f_code[1][1] = get_bits(&s->gb, 4); | |
| 1527 s->intra_dc_precision = get_bits(&s->gb, 2); | |
| 1528 s->picture_structure = get_bits(&s->gb, 2); | |
| 21 | 1529 s->top_field_first = get_bits1(&s->gb); |
| 1530 s->frame_pred_frame_dct = get_bits1(&s->gb); | |
| 1531 s->concealment_motion_vectors = get_bits1(&s->gb); | |
| 1532 s->q_scale_type = get_bits1(&s->gb); | |
| 1533 s->intra_vlc_format = get_bits1(&s->gb); | |
| 1534 s->alternate_scan = get_bits1(&s->gb); | |
| 1535 s->repeat_first_field = get_bits1(&s->gb); | |
| 1536 s->chroma_420_type = get_bits1(&s->gb); | |
| 1537 s->progressive_frame = get_bits1(&s->gb); | |
| 1708 | 1538 |
| 4070 | 1539 if(s->picture_structure == PICT_FRAME){ |
|
1096
5e6e505d8997
field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents:
1092
diff
changeset
|
1540 s->first_field=0; |
| 4070 | 1541 s->v_edge_pos= 16*s->mb_height; |
| 1542 }else{ | |
|
1096
5e6e505d8997
field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents:
1092
diff
changeset
|
1543 s->first_field ^= 1; |
| 4070 | 1544 s->v_edge_pos= 8*s->mb_height; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1545 memset(s->mbskip_table, 0, s->mb_stride*s->mb_height); |
|
1096
5e6e505d8997
field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents:
1092
diff
changeset
|
1546 } |
| 2967 | 1547 |
|
715
8b3ccabfce4a
move scantable init from block-decode to header parser
michaelni
parents:
714
diff
changeset
|
1548 if(s->alternate_scan){ |
| 1273 | 1549 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); |
| 1550 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); | |
|
715
8b3ccabfce4a
move scantable init from block-decode to header parser
michaelni
parents:
714
diff
changeset
|
1551 }else{ |
| 1273 | 1552 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); |
| 1553 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); | |
|
715
8b3ccabfce4a
move scantable init from block-decode to header parser
michaelni
parents:
714
diff
changeset
|
1554 } |
| 2967 | 1555 |
| 0 | 1556 /* composite display not parsed */ |
| 4652 | 1557 dprintf(s->avctx, "intra_dc_precision=%d\n", s->intra_dc_precision); |
| 1558 dprintf(s->avctx, "picture_structure=%d\n", s->picture_structure); | |
| 1559 dprintf(s->avctx, "top field first=%d\n", s->top_field_first); | |
| 1560 dprintf(s->avctx, "repeat first field=%d\n", s->repeat_first_field); | |
| 1561 dprintf(s->avctx, "conceal=%d\n", s->concealment_motion_vectors); | |
| 1562 dprintf(s->avctx, "intra_vlc_format=%d\n", s->intra_vlc_format); | |
| 1563 dprintf(s->avctx, "alternate_scan=%d\n", s->alternate_scan); | |
| 1564 dprintf(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct); | |
| 1565 dprintf(s->avctx, "progressive_frame=%d\n", s->progressive_frame); | |
| 0 | 1566 } |
| 1567 | |
| 2967 | 1568 static void mpeg_decode_extension(AVCodecContext *avctx, |
| 1862 | 1569 const uint8_t *buf, int buf_size) |
| 0 | 1570 { |
| 1571 Mpeg1Context *s1 = avctx->priv_data; | |
| 1572 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 1573 int ext_type; | |
| 1574 | |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1021
diff
changeset
|
1575 init_get_bits(&s->gb, buf, buf_size*8); |
| 2967 | 1576 |
| 0 | 1577 ext_type = get_bits(&s->gb, 4); |
| 1578 switch(ext_type) { | |
| 1579 case 0x1: | |
| 2219 | 1580 mpeg_decode_sequence_extension(s1); |
| 0 | 1581 break; |
| 1546 | 1582 case 0x2: |
| 1583 mpeg_decode_sequence_display_extension(s1); | |
| 1584 break; | |
| 0 | 1585 case 0x3: |
| 1586 mpeg_decode_quant_matrix_extension(s); | |
| 1587 break; | |
| 1546 | 1588 case 0x7: |
| 1589 mpeg_decode_picture_display_extension(s1); | |
| 1590 break; | |
| 0 | 1591 case 0x8: |
| 1592 mpeg_decode_picture_coding_extension(s); | |
| 1593 break; | |
| 1594 } | |
| 1595 } | |
| 1596 | |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1597 static void exchange_uv(MpegEncContext *s){ |
| 2219 | 1598 short * tmp = s->pblocks[4]; |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1599 s->pblocks[4] = s->pblocks[5]; |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1600 s->pblocks[5] = tmp; |
| 1380 | 1601 } |
| 1602 | |
| 1827 | 1603 static int mpeg_field_start(MpegEncContext *s){ |
| 1604 AVCodecContext *avctx= s->avctx; | |
| 1605 Mpeg1Context *s1 = (Mpeg1Context*)s; | |
| 826 | 1606 |
| 0 | 1607 /* start frame decoding */ |
| 1827 | 1608 if(s->first_field || s->picture_structure==PICT_FRAME){ |
|
771
d4cc92144266
handle direct rendering buffer allocation failure
michaelni
parents:
751
diff
changeset
|
1609 if(MPV_frame_start(s, avctx) < 0) |
| 1827 | 1610 return -1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1611 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1612 ff_er_frame_start(s); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1613 |
|
1085
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1614 /* first check if we must repeat the frame */ |
| 1409 | 1615 s->current_picture_ptr->repeat_pict = 0; |
|
1085
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1616 if (s->repeat_first_field) { |
|
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1617 if (s->progressive_sequence) { |
|
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1618 if (s->top_field_first) |
| 1409 | 1619 s->current_picture_ptr->repeat_pict = 4; |
|
1085
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1620 else |
| 1409 | 1621 s->current_picture_ptr->repeat_pict = 2; |
|
1085
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1622 } else if (s->progressive_frame) { |
| 1409 | 1623 s->current_picture_ptr->repeat_pict = 1; |
|
1085
9acf4b552047
move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents:
1084
diff
changeset
|
1624 } |
| 2967 | 1625 } |
| 1546 | 1626 |
| 1627 *s->current_picture_ptr->pan_scan= s1->pan_scan; | |
| 1827 | 1628 }else{ //second field |
| 1138 | 1629 int i; |
| 2967 | 1630 |
|
1182
38e8b8f331cb
some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents:
1181
diff
changeset
|
1631 if(!s->current_picture_ptr){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1632 av_log(s->avctx, AV_LOG_ERROR, "first field missing\n"); |
|
1182
38e8b8f331cb
some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents:
1181
diff
changeset
|
1633 return -1; |
|
38e8b8f331cb
some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents:
1181
diff
changeset
|
1634 } |
| 2967 | 1635 |
| 1138 | 1636 for(i=0; i<4; i++){ |
| 1637 s->current_picture.data[i] = s->current_picture_ptr->data[i]; | |
| 1638 if(s->picture_structure == PICT_BOTTOM_FIELD){ | |
| 1639 s->current_picture.data[i] += s->current_picture_ptr->linesize[i]; | |
| 2967 | 1640 } |
| 1138 | 1641 } |
| 1827 | 1642 } |
| 1381 | 1643 #ifdef HAVE_XVMC |
| 1644 // MPV_frame_start will call this function too, | |
| 1645 // but we need to call it on every field | |
| 1827 | 1646 if(s->avctx->xvmc_acceleration) |
| 1381 | 1647 XVMC_field_start(s,avctx); |
| 1648 #endif | |
| 1827 | 1649 |
| 1650 return 0; | |
| 1651 } | |
| 1652 | |
| 1653 #define DECODE_SLICE_ERROR -1 | |
| 1654 #define DECODE_SLICE_OK 0 | |
| 0 | 1655 |
| 1827 | 1656 /** |
| 1657 * decodes a slice. MpegEncContext.mb_y must be set to the MB row from the startcode | |
| 1658 * @return DECODE_SLICE_ERROR if the slice is damaged<br> | |
| 1659 * DECODE_SLICE_OK if this slice is ok<br> | |
| 1660 */ | |
| 1661 static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y, | |
| 1862 | 1662 const uint8_t **buf, int buf_size) |
| 1827 | 1663 { |
| 1664 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 1665 AVCodecContext *avctx= s->avctx; | |
| 1666 int ret; | |
| 1667 const int field_pic= s->picture_structure != PICT_FRAME; | |
| 2256 | 1668 const int lowres= s->avctx->lowres; |
| 1827 | 1669 |
| 1670 s->resync_mb_x= | |
| 1671 s->resync_mb_y= -1; | |
| 1672 | |
| 1953 | 1673 if (mb_y<<field_pic >= s->mb_height){ |
| 1674 av_log(s->avctx, AV_LOG_ERROR, "slice below image (%d >= %d)\n", mb_y, s->mb_height); | |
| 1827 | 1675 return -1; |
| 1676 } | |
| 2967 | 1677 |
| 1211 | 1678 init_get_bits(&s->gb, *buf, buf_size*8); |
| 0 | 1679 |
| 1827 | 1680 ff_mpeg1_clean_buffers(s); |
| 1681 s->interlaced_dct = 0; | |
| 1682 | |
| 54 | 1683 s->qscale = get_qscale(s); |
| 1690 | 1684 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1685 if(s->qscale == 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1686 av_log(s->avctx, AV_LOG_ERROR, "qscale == 0\n"); |
| 1285 | 1687 return -1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1688 } |
| 2967 | 1689 |
| 0 | 1690 /* extra slice info */ |
| 21 | 1691 while (get_bits1(&s->gb) != 0) { |
| 1692 skip_bits(&s->gb, 8); | |
| 0 | 1693 } |
| 2967 | 1694 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1695 s->mb_x=0; |
| 0 | 1696 |
| 716 | 1697 for(;;) { |
| 1698 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2); | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1699 if (code < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1700 av_log(s->avctx, AV_LOG_ERROR, "first mb_incr damaged\n"); |
| 1285 | 1701 return -1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1702 } |
| 716 | 1703 if (code >= 33) { |
| 1704 if (code == 33) { | |
| 1705 s->mb_x += 33; | |
| 1706 } | |
| 1707 /* otherwise, stuffing, nothing to do */ | |
| 1708 } else { | |
| 1709 s->mb_x += code; | |
| 1710 break; | |
| 1711 } | |
| 1712 } | |
|
4502
ff5472c81ab8
fix segfault with lol-ffplay2.mpg (dunno if this is exploitable, probably not easily)
michael
parents:
4454
diff
changeset
|
1713 if(s->mb_x >= (unsigned)s->mb_width){ |
|
ff5472c81ab8
fix segfault with lol-ffplay2.mpg (dunno if this is exploitable, probably not easily)
michael
parents:
4454
diff
changeset
|
1714 av_log(s->avctx, AV_LOG_ERROR, "initial skip overflow\n"); |
|
ff5472c81ab8
fix segfault with lol-ffplay2.mpg (dunno if this is exploitable, probably not easily)
michael
parents:
4454
diff
changeset
|
1715 return -1; |
|
ff5472c81ab8
fix segfault with lol-ffplay2.mpg (dunno if this is exploitable, probably not easily)
michael
parents:
4454
diff
changeset
|
1716 } |
| 1827 | 1717 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1718 s->resync_mb_x= s->mb_x; |
| 1827 | 1719 s->resync_mb_y= s->mb_y= mb_y; |
| 1160 | 1720 s->mb_skip_run= 0; |
| 1389 | 1721 ff_init_block_index(s); |
| 716 | 1722 |
| 1827 | 1723 if (s->mb_y==0 && s->mb_x==0 && (s->first_field || s->picture_structure==PICT_FRAME)) { |
| 1724 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ | |
| 2967 | 1725 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%2d%2d%2d%2d %s %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n", |
| 1827 | 1726 s->qscale, s->mpeg_f_code[0][0],s->mpeg_f_code[0][1],s->mpeg_f_code[1][0],s->mpeg_f_code[1][1], |
| 2967 | 1727 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), |
| 1728 s->progressive_sequence ? "ps" :"", s->progressive_frame ? "pf" : "", s->alternate_scan ? "alt" :"", s->top_field_first ? "top" :"", | |
| 1827 | 1729 s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors, |
| 1730 s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :""); | |
| 1731 } | |
| 2967 | 1732 } |
| 1733 | |
| 0 | 1734 for(;;) { |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1735 #ifdef HAVE_XVMC |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1736 //one 1 we memcpy blocks in xvmcvideo |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1737 if(s->avctx->xvmc_acceleration > 1) |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1738 XVMC_init_block(s);//set s->block |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1739 #endif |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
1740 |
|
12
4d50c7d89e0f
use block[] in structure to have it aligned on 8 bytes for mmx optimizations
glantau
parents:
7
diff
changeset
|
1741 ret = mpeg_decode_mb(s, s->block); |
| 1644 | 1742 s->chroma_qscale= s->qscale; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1743 |
| 4652 | 1744 dprintf(s->avctx, "ret=%d\n", ret); |
| 0 | 1745 if (ret < 0) |
| 1746 return -1; | |
|
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1655
diff
changeset
|
1747 |
| 1692 | 1748 if(s->current_picture.motion_val[0] && !s->encoding){ //note motion_val is normally NULL unless we want to extract the MVs |
|
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1915
diff
changeset
|
1749 const int wrap = field_pic ? 2*s->b8_stride : s->b8_stride; |
|
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1915
diff
changeset
|
1750 int xy = s->mb_x*2 + s->mb_y*2*wrap; |
| 1841 | 1751 int motion_x, motion_y, dir, i; |
| 1692 | 1752 if(field_pic && !s->first_field) |
| 1753 xy += wrap/2; | |
| 1754 | |
| 1852 | 1755 for(i=0; i<2; i++){ |
| 1756 for(dir=0; dir<2; dir++){ | |
| 1841 | 1757 if (s->mb_intra || (dir==1 && s->pict_type != B_TYPE)) { |
| 1758 motion_x = motion_y = 0; | |
| 1946 | 1759 }else if (s->mv_type == MV_TYPE_16X16 || (s->mv_type == MV_TYPE_FIELD && field_pic)){ |
| 1841 | 1760 motion_x = s->mv[dir][0][0]; |
| 1761 motion_y = s->mv[dir][0][1]; | |
| 1762 } else /*if ((s->mv_type == MV_TYPE_FIELD) || (s->mv_type == MV_TYPE_16X8))*/ { | |
| 1763 motion_x = s->mv[dir][i][0]; | |
| 1764 motion_y = s->mv[dir][i][1]; | |
| 1765 } | |
| 1948 | 1766 |
| 1841 | 1767 s->current_picture.motion_val[dir][xy ][0] = motion_x; |
| 1768 s->current_picture.motion_val[dir][xy ][1] = motion_y; | |
| 1769 s->current_picture.motion_val[dir][xy + 1][0] = motion_x; | |
| 1770 s->current_picture.motion_val[dir][xy + 1][1] = motion_y; | |
| 1948 | 1771 s->current_picture.ref_index [dir][xy ]= |
| 1772 s->current_picture.ref_index [dir][xy + 1]= s->field_select[dir][i]; | |
| 2670 | 1773 assert(s->field_select[dir][i]==0 || s->field_select[dir][i]==1); |
| 1841 | 1774 } |
| 1852 | 1775 xy += wrap; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1776 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1777 } |
|
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1655
diff
changeset
|
1778 |
| 2256 | 1779 s->dest[0] += 16 >> lowres; |
| 1780 s->dest[1] += 16 >> (s->chroma_x_shift + lowres); | |
| 1781 s->dest[2] += 16 >> (s->chroma_x_shift + lowres); | |
| 1389 | 1782 |
| 716 | 1783 MPV_decode_mb(s, s->block); |
| 2967 | 1784 |
| 716 | 1785 if (++s->mb_x >= s->mb_width) { |
| 2261 | 1786 const int mb_size= 16>>s->avctx->lowres; |
| 1380 | 1787 |
| 2261 | 1788 ff_draw_horiz_band(s, mb_size*s->mb_y, mb_size); |
| 716 | 1789 |
| 1790 s->mb_x = 0; | |
| 1791 s->mb_y++; | |
|
1289
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1792 |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1793 if(s->mb_y<<field_pic >= s->mb_height){ |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1794 int left= s->gb.size_in_bits - get_bits_count(&s->gb); |
| 3287 | 1795 int is_d10= s->chroma_format==2 && s->pict_type==I_TYPE && avctx->profile==0 && avctx->level==5 |
| 1796 && s->intra_dc_precision == 2 && s->q_scale_type == 1 && s->alternate_scan == 0 | |
| 1797 && s->progressive_frame == 0 /* vbv_delay == 0xBBB || 0xE10*/; | |
| 1798 | |
| 1799 if(left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10) | |
|
1289
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1800 || (avctx->error_resilience >= FF_ER_AGGRESSIVE && left>8)){ |
| 3287 | 1801 av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n", left, show_bits(&s->gb, FFMIN(left, 23))); |
|
1289
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1802 return -1; |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1803 }else |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1804 goto eos; |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
1805 } |
| 2967 | 1806 |
| 1389 | 1807 ff_init_block_index(s); |
| 716 | 1808 } |
| 1809 | |
| 1810 /* skip mb handling */ | |
| 1160 | 1811 if (s->mb_skip_run == -1) { |
| 716 | 1812 /* read again increment */ |
| 1160 | 1813 s->mb_skip_run = 0; |
| 716 | 1814 for(;;) { |
| 1815 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2); | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1816 if (code < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1817 av_log(s->avctx, AV_LOG_ERROR, "mb incr damaged\n"); |
| 1181 | 1818 return -1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1819 } |
| 716 | 1820 if (code >= 33) { |
| 1821 if (code == 33) { | |
| 1160 | 1822 s->mb_skip_run += 33; |
| 1181 | 1823 }else if(code == 35){ |
| 1824 if(s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1587
diff
changeset
|
1825 av_log(s->avctx, AV_LOG_ERROR, "slice mismatch\n"); |
| 1181 | 1826 return -1; |
| 1827 } | |
| 1828 goto eos; /* end of slice */ | |
| 716 | 1829 } |
| 1830 /* otherwise, stuffing, nothing to do */ | |
| 1831 } else { | |
| 1160 | 1832 s->mb_skip_run += code; |
| 716 | 1833 break; |
| 1834 } | |
| 1835 } | |
| 1836 } | |
| 0 | 1837 } |
| 1285 | 1838 eos: // end of slice |
| 1839 *buf += get_bits_count(&s->gb)/8 - 1; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1840 //printf("y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y); |
| 1285 | 1841 return 0; |
| 1842 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1843 |
| 1827 | 1844 static int slice_decode_thread(AVCodecContext *c, void *arg){ |
| 1845 MpegEncContext *s= arg; | |
| 1861 | 1846 const uint8_t *buf= s->gb.buffer; |
| 1827 | 1847 int mb_y= s->start_mb_y; |
| 1848 | |
| 1849 s->error_count= 3*(s->end_mb_y - s->start_mb_y)*s->mb_width; | |
| 1850 | |
| 1851 for(;;){ | |
| 3776 | 1852 uint32_t start_code; |
| 1853 int ret; | |
| 1827 | 1854 |
| 1855 ret= mpeg_decode_slice((Mpeg1Context*)s, mb_y, &buf, s->gb.buffer_end - buf); | |
| 1856 emms_c(); | |
| 2967 | 1857 //av_log(c, AV_LOG_DEBUG, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n", |
| 1827 | 1858 //ret, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, s->start_mb_y, s->end_mb_y, s->error_count); |
| 1859 if(ret < 0){ | |
| 1860 if(s->resync_mb_x>=0 && s->resync_mb_y>=0) | |
| 1861 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); | |
| 1862 }else{ | |
| 1863 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); | |
| 1864 } | |
| 2967 | 1865 |
| 1827 | 1866 if(s->mb_y == s->end_mb_y) |
| 1867 return 0; | |
| 2967 | 1868 |
| 3086 | 1869 start_code= -1; |
| 1870 buf = ff_find_start_code(buf, s->gb.buffer_end, &start_code); | |
| 1827 | 1871 mb_y= start_code - SLICE_MIN_START_CODE; |
| 1872 if(mb_y < 0 || mb_y >= s->end_mb_y) | |
| 1873 return -1; | |
| 1874 } | |
| 2967 | 1875 |
| 1827 | 1876 return 0; //not reached |
| 1877 } | |
| 1878 | |
| 1285 | 1879 /** |
| 1880 * handles slice ends. | |
| 2967 | 1881 * @return 1 if it seems to be the last slice of |
| 1285 | 1882 */ |
| 1883 static int slice_end(AVCodecContext *avctx, AVFrame *pict) | |
| 1884 { | |
| 1885 Mpeg1Context *s1 = avctx->priv_data; | |
| 1886 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2967 | 1887 |
|
1402
f662e9c86cf2
* fixing a regression in mpeg encoder (not setting pix_fmt),
romansh
parents:
1389
diff
changeset
|
1888 if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr) |
|
1311
fc858abf6b10
fixed segfault if sequence header has not been found before slice decoding
bellard
parents:
1289
diff
changeset
|
1889 return 0; |
|
fc858abf6b10
fixed segfault if sequence header has not been found before slice decoding
bellard
parents:
1289
diff
changeset
|
1890 |
| 1381 | 1891 #ifdef HAVE_XVMC |
| 1892 if(s->avctx->xvmc_acceleration) | |
| 1893 XVMC_field_end(s); | |
| 1894 #endif | |
| 0 | 1895 /* end of slice reached */ |
| 1285 | 1896 if (/*s->mb_y<<field_pic == s->mb_height &&*/ !s->first_field) { |
| 0 | 1897 /* end of image */ |
| 903 | 1898 |
| 1728 | 1899 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2; |
| 1196 | 1900 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1901 ff_er_frame_end(s); |
| 0 | 1902 |
| 1903 MPV_frame_end(s); | |
| 1904 | |
| 924 | 1905 if (s->pict_type == B_TYPE || s->low_delay) { |
| 1328 | 1906 *pict= *(AVFrame*)s->current_picture_ptr; |
|
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1697
diff
changeset
|
1907 ff_print_debug_info(s, pict); |
| 0 | 1908 } else { |
| 903 | 1909 s->picture_number++; |
| 0 | 1910 /* latency of 1 frame for I and P frames */ |
| 1911 /* XXX: use another variable than picture_number */ | |
| 1211 | 1912 if (s->last_picture_ptr != NULL) { |
| 1328 | 1913 *pict= *(AVFrame*)s->last_picture_ptr; |
|
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1697
diff
changeset
|
1914 ff_print_debug_info(s, pict); |
| 0 | 1915 } |
| 1916 } | |
| 1380 | 1917 |
| 1285 | 1918 return 1; |
| 0 | 1919 } else { |
| 1285 | 1920 return 0; |
| 0 | 1921 } |
| 1922 } | |
| 1923 | |
| 2967 | 1924 static int mpeg1_decode_sequence(AVCodecContext *avctx, |
| 1862 | 1925 const uint8_t *buf, int buf_size) |
| 0 | 1926 { |
| 1927 Mpeg1Context *s1 = avctx->priv_data; | |
| 1928 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1929 int width,height; |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1930 int i, v, j; |
|
401
e20655449d4a
mpeg1/2 identifier - fixed frame rate for some bad mpeg1 streams
glantau
parents:
391
diff
changeset
|
1931 |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1021
diff
changeset
|
1932 init_get_bits(&s->gb, buf, buf_size*8); |
| 0 | 1933 |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1934 width = get_bits(&s->gb, 12); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1935 height = get_bits(&s->gb, 12); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1936 if (width <= 0 || height <= 0 || |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1937 (width % 2) != 0 || (height % 2) != 0) |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1938 return -1; |
| 917 | 1939 s->aspect_ratio_info= get_bits(&s->gb, 4); |
|
1674
835964e33ba2
fixed potential problem if aspect_ratio_info == 0 for MPEG stream - fixed aspect ratio problem if CODEC_ID_MPEG2VIDEO is used to decode an MPEG1 stream (which is the recommended codec id for mpeg video)
bellard
parents:
1673
diff
changeset
|
1940 if (s->aspect_ratio_info == 0) |
|
835964e33ba2
fixed potential problem if aspect_ratio_info == 0 for MPEG stream - fixed aspect ratio problem if CODEC_ID_MPEG2VIDEO is used to decode an MPEG1 stream (which is the recommended codec id for mpeg video)
bellard
parents:
1673
diff
changeset
|
1941 return -1; |
| 0 | 1942 s->frame_rate_index = get_bits(&s->gb, 4); |
| 1837 | 1943 if (s->frame_rate_index == 0 || s->frame_rate_index > 13) |
| 0 | 1944 return -1; |
| 1945 s->bit_rate = get_bits(&s->gb, 18) * 400; | |
| 21 | 1946 if (get_bits1(&s->gb) == 0) /* marker */ |
| 0 | 1947 return -1; |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1948 s->width = width; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
1949 s->height = height; |
| 0 | 1950 |
|
1710
4a68b20eeb2c
print vbv buffer size & bitrate when decoding with -debug 1
michael
parents:
1708
diff
changeset
|
1951 s->avctx->rc_buffer_size= get_bits(&s->gb, 10) * 1024*16; |
| 21 | 1952 skip_bits(&s->gb, 1); |
| 0 | 1953 |
| 1954 /* get matrix */ | |
| 21 | 1955 if (get_bits1(&s->gb)) { |
| 0 | 1956 for(i=0;i<64;i++) { |
| 1957 v = get_bits(&s->gb, 8); | |
| 1809 | 1958 if(v==0){ |
| 1959 av_log(s->avctx, AV_LOG_ERROR, "intra matrix damaged\n"); | |
| 1960 return -1; | |
| 1961 } | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1962 j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
38
5bf15419d47e
changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents:
21
diff
changeset
|
1963 s->intra_matrix[j] = v; |
|
5bf15419d47e
changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents:
21
diff
changeset
|
1964 s->chroma_intra_matrix[j] = v; |
| 0 | 1965 } |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1966 #ifdef DEBUG |
| 4652 | 1967 dprintf(s->avctx, "intra matrix present\n"); |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1968 for(i=0;i<64;i++) |
| 4652 | 1969 dprintf(s->avctx, " %d", s->intra_matrix[s->dsp.idct_permutation[i]]); |
| 1970 dprintf(s->avctx, "\n"); | |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1971 #endif |
| 0 | 1972 } else { |
| 1973 for(i=0;i<64;i++) { | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1974 j = s->dsp.idct_permutation[i]; |
|
533
3c07cf9595de
adding ff prefix to avoid global name conficts with xvid (patch by Marko Kreen <marko at l-t.ee>)
michaelni
parents:
520
diff
changeset
|
1975 v = ff_mpeg1_default_intra_matrix[i]; |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
694
diff
changeset
|
1976 s->intra_matrix[j] = v; |
|
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
694
diff
changeset
|
1977 s->chroma_intra_matrix[j] = v; |
| 0 | 1978 } |
| 1979 } | |
| 21 | 1980 if (get_bits1(&s->gb)) { |
| 0 | 1981 for(i=0;i<64;i++) { |
| 1982 v = get_bits(&s->gb, 8); | |
| 1809 | 1983 if(v==0){ |
| 1984 av_log(s->avctx, AV_LOG_ERROR, "inter matrix damaged\n"); | |
| 1985 return -1; | |
| 1986 } | |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
1987 j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
| 344 | 1988 s->inter_matrix[j] = v; |
| 1989 s->chroma_inter_matrix[j] = v; | |
| 0 | 1990 } |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1991 #ifdef DEBUG |
| 4652 | 1992 dprintf(s->avctx, "non intra matrix present\n"); |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1993 for(i=0;i<64;i++) |
| 4652 | 1994 dprintf(s->avctx, " %d", s->inter_matrix[s->dsp.idct_permutation[i]]); |
| 1995 dprintf(s->avctx, "\n"); | |
|
59
efd3c19f6d62
fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents:
58
diff
changeset
|
1996 #endif |
| 0 | 1997 } else { |
| 1998 for(i=0;i<64;i++) { | |
| 1092 | 1999 int j= s->dsp.idct_permutation[i]; |
|
533
3c07cf9595de
adding ff prefix to avoid global name conficts with xvid (patch by Marko Kreen <marko at l-t.ee>)
michaelni
parents:
520
diff
changeset
|
2000 v = ff_mpeg1_default_non_intra_matrix[i]; |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
694
diff
changeset
|
2001 s->inter_matrix[j] = v; |
|
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
694
diff
changeset
|
2002 s->chroma_inter_matrix[j] = v; |
| 0 | 2003 } |
| 2004 } | |
| 2967 | 2005 |
| 1809 | 2006 if(show_bits(&s->gb, 23) != 0){ |
| 2007 av_log(s->avctx, AV_LOG_ERROR, "sequence header damaged\n"); | |
| 2008 return -1; | |
| 2009 } | |
| 0 | 2010 |
| 2011 /* we set mpeg2 parameters so that it emulates mpeg1 */ | |
| 2012 s->progressive_sequence = 1; | |
| 2013 s->progressive_frame = 1; | |
| 2014 s->picture_structure = PICT_FRAME; | |
| 2015 s->frame_pred_frame_dct = 1; | |
| 1850 | 2016 s->chroma_format = 1; |
| 1421 | 2017 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO; |
|
401
e20655449d4a
mpeg1/2 identifier - fixed frame rate for some bad mpeg1 streams
glantau
parents:
391
diff
changeset
|
2018 avctx->sub_id = 1; /* indicates mpeg1 */ |
|
1888
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
2019 s->out_format = FMT_MPEG1; |
|
4bbe33eed9f0
move MPV_common_init after parsing stream parameters, matrix rebuild
iive
parents:
1880
diff
changeset
|
2020 s->swap_uv = 0;//AFAIK VCR2 don't have SEQ_HEADER |
| 1672 | 2021 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1; |
| 2967 | 2022 |
|
1710
4a68b20eeb2c
print vbv buffer size & bitrate when decoding with -debug 1
michael
parents:
1708
diff
changeset
|
2023 if(s->avctx->debug & FF_DEBUG_PICT_INFO) |
| 2967 | 2024 av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%d\n", |
|
1710
4a68b20eeb2c
print vbv buffer size & bitrate when decoding with -debug 1
michael
parents:
1708
diff
changeset
|
2025 s->avctx->rc_buffer_size, s->bit_rate); |
| 2967 | 2026 |
| 0 | 2027 return 0; |
| 2028 } | |
| 2029 | |
| 1376 | 2030 static int vcr2_init_sequence(AVCodecContext *avctx) |
| 2031 { | |
| 2032 Mpeg1Context *s1 = avctx->priv_data; | |
| 2033 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 1377 | 2034 int i, v; |
| 1376 | 2035 |
| 2036 /* start new mpeg1 context decoding */ | |
| 2037 s->out_format = FMT_MPEG1; | |
| 2038 if (s1->mpeg_enc_ctx_allocated) { | |
| 2039 MPV_common_end(s); | |
| 2040 } | |
| 2270 | 2041 s->width = avctx->coded_width; |
| 2042 s->height = avctx->coded_height; | |
| 1376 | 2043 avctx->has_b_frames= 0; //true? |
| 1380 | 2044 s->low_delay= 1; |
| 1381 | 2045 |
| 1821 | 2046 if(avctx->xvmc_acceleration){ |
| 2047 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); | |
| 2048 }else{ | |
| 2049 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420); | |
| 2050 } | |
| 2051 | |
| 1381 | 2052 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT ) |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
2053 if( avctx->idct_algo == FF_IDCT_AUTO ) |
|
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
2054 avctx->idct_algo = FF_IDCT_SIMPLE; |
| 2967 | 2055 |
| 1376 | 2056 if (MPV_common_init(s) < 0) |
| 2057 return -1; | |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
2058 exchange_uv(s);//common init reset pblocks, so we swap them here |
| 2967 | 2059 s->swap_uv = 1;// in case of xvmc we need to swap uv for each MB |
| 1376 | 2060 s1->mpeg_enc_ctx_allocated = 1; |
| 2061 | |
| 2062 for(i=0;i<64;i++) { | |
| 2063 int j= s->dsp.idct_permutation[i]; | |
| 2064 v = ff_mpeg1_default_intra_matrix[i]; | |
| 2065 s->intra_matrix[j] = v; | |
| 2066 s->chroma_intra_matrix[j] = v; | |
| 2067 | |
| 2068 v = ff_mpeg1_default_non_intra_matrix[i]; | |
| 2069 s->inter_matrix[j] = v; | |
| 2070 s->chroma_inter_matrix[j] = v; | |
| 2071 } | |
| 2072 | |
| 2073 s->progressive_sequence = 1; | |
| 2074 s->progressive_frame = 1; | |
| 2075 s->picture_structure = PICT_FRAME; | |
| 2076 s->frame_pred_frame_dct = 1; | |
| 1850 | 2077 s->chroma_format = 1; |
| 1421 | 2078 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; |
| 1377 | 2079 avctx->sub_id = 2; /* indicates mpeg2 */ |
| 1376 | 2080 return 0; |
| 2081 } | |
| 2082 | |
| 2083 | |
| 2967 | 2084 static void mpeg_decode_user_data(AVCodecContext *avctx, |
| 1084 | 2085 const uint8_t *buf, int buf_size) |
| 2086 { | |
| 2087 const uint8_t *p; | |
| 2088 int len, flags; | |
| 2089 p = buf; | |
| 2090 len = buf_size; | |
| 2091 | |
| 2092 /* we parse the DTG active format information */ | |
| 2093 if (len >= 5 && | |
| 2094 p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') { | |
| 2095 flags = p[4]; | |
| 2096 p += 5; | |
| 2097 len -= 5; | |
| 2098 if (flags & 0x80) { | |
| 2099 /* skip event id */ | |
| 2100 if (len < 2) | |
| 2101 return; | |
| 2102 p += 2; | |
| 2103 len -= 2; | |
| 2104 } | |
| 2105 if (flags & 0x40) { | |
| 2106 if (len < 1) | |
| 2107 return; | |
| 2108 avctx->dtg_active_format = p[0] & 0x0f; | |
| 2109 } | |
| 2110 } | |
| 2111 } | |
| 2112 | |
| 2967 | 2113 static void mpeg_decode_gop(AVCodecContext *avctx, |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2114 const uint8_t *buf, int buf_size){ |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2115 Mpeg1Context *s1 = avctx->priv_data; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2116 MpegEncContext *s = &s1->mpeg_enc_ctx; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2117 |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2118 int drop_frame_flag; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2119 int time_code_hours, time_code_minutes; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2120 int time_code_seconds, time_code_pictures; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2121 int broken_link; |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2122 |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2123 init_get_bits(&s->gb, buf, buf_size*8); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2124 |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2125 drop_frame_flag = get_bits1(&s->gb); |
| 2967 | 2126 |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2127 time_code_hours=get_bits(&s->gb,5); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2128 time_code_minutes = get_bits(&s->gb,6); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2129 skip_bits1(&s->gb);//marker bit |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2130 time_code_seconds = get_bits(&s->gb,6); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2131 time_code_pictures = get_bits(&s->gb,6); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2132 |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2133 /*broken_link indicate that after editing the |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2134 reference frames of the first B-Frames after GOP I-Frame |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2135 are missing (open gop)*/ |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2136 broken_link = get_bits1(&s->gb); |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2137 |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2138 if(s->avctx->debug & FF_DEBUG_PICT_INFO) |
|
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2139 av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) broken_link=%d\n", |
| 2979 | 2140 time_code_hours, time_code_minutes, time_code_seconds, |
| 2141 time_code_pictures, broken_link); | |
|
1890
a07406ac4725
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
iive
parents:
1888
diff
changeset
|
2142 } |
| 1211 | 2143 /** |
| 2144 * finds the end of the current frame in the bitstream. | |
| 2145 * @return the position of the first byte of the next frame, or -1 | |
| 2146 */ | |
|
4916
13ef168891b0
add a ff_ prefix to the now exported mpeg1_find_frame_end() function
aurel
parents:
4915
diff
changeset
|
2147 int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) |
| 1988 | 2148 { |
| 1211 | 2149 int i; |
| 3086 | 2150 uint32_t state= pc->state; |
| 2967 | 2151 |
| 1211 | 2152 i=0; |
| 2153 if(!pc->frame_start_found){ | |
| 2154 for(i=0; i<buf_size; i++){ | |
| 3086 | 2155 i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; |
| 1211 | 2156 if(state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE){ |
| 2157 i++; | |
| 2158 pc->frame_start_found=1; | |
| 2159 break; | |
| 2160 } | |
| 2161 } | |
| 2162 } | |
| 2967 | 2163 |
| 1211 | 2164 if(pc->frame_start_found){ |
| 1988 | 2165 /* EOF considered as end of frame */ |
| 2166 if (buf_size == 0) | |
| 2167 return 0; | |
| 1211 | 2168 for(; i<buf_size; i++){ |
| 3086 | 2169 i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; |
| 1211 | 2170 if((state&0xFFFFFF00) == 0x100){ |
| 2171 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ | |
| 2172 pc->frame_start_found=0; | |
| 2967 | 2173 pc->state=-1; |
| 1211 | 2174 return i-3; |
| 2175 } | |
| 2176 } | |
| 2177 } | |
| 2967 | 2178 } |
| 1211 | 2179 pc->state= state; |
|
1218
358bbc952e27
10l (returning negative number of consumed bytes if the first startcode of a frame was split between 2 buffers)
michaelni
parents:
1211
diff
changeset
|
2180 return END_NOT_FOUND; |
| 1211 | 2181 } |
| 2182 | |
| 0 | 2183 /* handle buffering and image synchronisation */ |
| 2967 | 2184 static int mpeg_decode_frame(AVCodecContext *avctx, |
| 0 | 2185 void *data, int *data_size, |
| 1064 | 2186 uint8_t *buf, int buf_size) |
| 0 | 2187 { |
| 2188 Mpeg1Context *s = avctx->priv_data; | |
| 1862 | 2189 const uint8_t *buf_end; |
| 2190 const uint8_t *buf_ptr; | |
| 3776 | 2191 uint32_t start_code; |
| 2192 int ret, input_size; | |
| 925 | 2193 AVFrame *picture = data; |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
2194 MpegEncContext *s2 = &s->mpeg_enc_ctx; |
| 4652 | 2195 dprintf(avctx, "fill_buffer\n"); |
| 0 | 2196 |
|
2130
50779a18844c
Avoid segfault on ffmpeg "buffer flush" in mpeg12.c patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
2111
diff
changeset
|
2197 if (buf_size == 0) { |
| 2979 | 2198 /* special case for last picture */ |
| 2199 if (s2->low_delay==0 && s2->next_picture_ptr) { | |
| 2200 *picture= *(AVFrame*)s2->next_picture_ptr; | |
| 2201 s2->next_picture_ptr= NULL; | |
| 2202 | |
| 2203 *data_size = sizeof(AVFrame); | |
| 2204 } | |
| 0 | 2205 return 0; |
| 2206 } | |
| 2207 | |
| 1211 | 2208 if(s2->flags&CODEC_FLAG_TRUNCATED){ |
|
4916
13ef168891b0
add a ff_ prefix to the now exported mpeg1_find_frame_end() function
aurel
parents:
4915
diff
changeset
|
2209 int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size); |
| 2967 | 2210 |
|
4931
0d1cc37d9430
make some parser parameters const to avoid casting const to non-const
aurel
parents:
4916
diff
changeset
|
2211 if( ff_combine_frame(&s2->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 ) |
| 1211 | 2212 return buf_size; |
| 2967 | 2213 } |
| 2214 | |
| 0 | 2215 buf_ptr = buf; |
| 2216 buf_end = buf + buf_size; | |
|
383
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2217 |
| 2967 | 2218 #if 0 |
| 2219 if (s->repeat_field % 2 == 1) { | |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
2220 s->repeat_field++; |
|
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
2221 //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number, |
|
383
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2222 // s2->picture_number, s->repeat_field); |
|
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2223 if (avctx->flags & CODEC_FLAG_REPEAT_FIELD) { |
|
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2224 *data_size = sizeof(AVPicture); |
|
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2225 goto the_end; |
|
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2226 } |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
241
diff
changeset
|
2227 } |
|
383
e6b64bc3bc87
- repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents:
377
diff
changeset
|
2228 #endif |
| 1376 | 2229 |
| 2230 if(s->mpeg_enc_ctx_allocated==0 && avctx->codec_tag == ff_get_fourcc("VCR2")) | |
| 2231 vcr2_init_sequence(avctx); | |
| 2967 | 2232 |
| 1827 | 2233 s->slice_count= 0; |
| 2967 | 2234 |
| 1211 | 2235 for(;;) { |
| 0 | 2236 /* find start next code */ |
| 3086 | 2237 start_code = -1; |
| 2238 buf_ptr = ff_find_start_code(buf_ptr,buf_end, &start_code); | |
| 3776 | 2239 if (start_code > 0x1ff){ |
| 2792 | 2240 if(s2->pict_type != B_TYPE || avctx->skip_frame <= AVDISCARD_DEFAULT){ |
| 1827 | 2241 if(avctx->thread_count > 1){ |
| 2242 int i; | |
| 2243 | |
| 2244 avctx->execute(avctx, slice_decode_thread, (void**)&(s2->thread_context[0]), NULL, s->slice_count); | |
| 2245 for(i=0; i<s->slice_count; i++) | |
| 2246 s2->error_count += s2->thread_context[i]->error_count; | |
| 2247 } | |
| 1484 | 2248 if (slice_end(avctx, picture)) { |
| 1672 | 2249 if(s2->last_picture_ptr || s2->low_delay) //FIXME merge with the stuff in mpeg_decode_slice |
| 1484 | 2250 *data_size = sizeof(AVPicture); |
| 2251 } | |
| 1285 | 2252 } |
| 1220 | 2253 return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index); |
| 0 | 2254 } |
| 2967 | 2255 |
|
1289
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
2256 input_size = buf_end - buf_ptr; |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
2257 |
|
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
2258 if(avctx->debug & FF_DEBUG_STARTCODE){ |
| 1904 | 2259 av_log(avctx, AV_LOG_DEBUG, "%3X at %zd left %d\n", start_code, buf_ptr-buf, input_size); |
|
1289
57172377849a
fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents:
1285
diff
changeset
|
2260 } |
| 1211 | 2261 |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2262 /* prepare data for next start code */ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2263 switch(start_code) { |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2264 case SEQ_START_CODE: |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2265 mpeg1_decode_sequence(avctx, buf_ptr, |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2266 input_size); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2267 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2268 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2269 case PICTURE_START_CODE: |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2270 /* we have a complete image : we try to decompress it */ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2271 mpeg1_decode_picture(avctx, |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2272 buf_ptr, input_size); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2273 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2274 case EXT_START_CODE: |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2275 mpeg_decode_extension(avctx, |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2276 buf_ptr, input_size); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2277 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2278 case USER_START_CODE: |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2279 mpeg_decode_user_data(avctx, |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2280 buf_ptr, input_size); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2281 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2282 case GOP_START_CODE: |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2283 s2->first_field=0; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2284 mpeg_decode_gop(avctx, |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2285 buf_ptr, input_size); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2286 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2287 default: |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2288 if (start_code >= SLICE_MIN_START_CODE && |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2289 start_code <= SLICE_MAX_START_CODE) { |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2290 int mb_y= start_code - SLICE_MIN_START_CODE; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2291 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2292 if(s2->last_picture_ptr==NULL){ |
| 5127 | 2293 /* Skip B-frames if we do not have reference frames. */ |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2294 if(s2->pict_type==B_TYPE) break; |
| 5127 | 2295 /* Skip P-frames if we do not have reference frame no valid header. */ |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2296 // if(s2->pict_type==P_TYPE && s2->first_field && !s2->first_slice) break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2297 } |
| 5127 | 2298 /* Skip B-frames if we are in a hurry. */ |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2299 if(avctx->hurry_up && s2->pict_type==B_TYPE) break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2300 if( (avctx->skip_frame >= AVDISCARD_NONREF && s2->pict_type==B_TYPE) |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2301 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s2->pict_type!=I_TYPE) |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2302 || avctx->skip_frame >= AVDISCARD_ALL) |
| 0 | 2303 break; |
| 5127 | 2304 /* Skip everything if we are in a hurry>=5. */ |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2305 if(avctx->hurry_up>=5) break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2306 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2307 if (!s->mpeg_enc_ctx_allocated) break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2308 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2309 if(s2->codec_id == CODEC_ID_MPEG2VIDEO){ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2310 if(mb_y < avctx->skip_top || mb_y >= s2->mb_height - avctx->skip_bottom) |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2311 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2312 } |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2313 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2314 if(s2->first_slice){ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2315 s2->first_slice=0; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2316 if(mpeg_field_start(s2) < 0) |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2317 return -1; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2318 } |
|
4353
d9cd0e5255d7
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.mpg and http://sam.zoy.org/zzuf/lol-ffplay.m2v
michael
parents:
4283
diff
changeset
|
2319 if(!s2->current_picture_ptr){ |
| 5129 | 2320 av_log(avctx, AV_LOG_ERROR, "current_picture not initialized\n"); |
|
4353
d9cd0e5255d7
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.mpg and http://sam.zoy.org/zzuf/lol-ffplay.m2v
michael
parents:
4283
diff
changeset
|
2321 return -1; |
|
d9cd0e5255d7
fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.mpg and http://sam.zoy.org/zzuf/lol-ffplay.m2v
michael
parents:
4283
diff
changeset
|
2322 } |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2323 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2324 if(avctx->thread_count > 1){ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2325 int threshold= (s2->mb_height*s->slice_count + avctx->thread_count/2) / avctx->thread_count; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2326 if(threshold <= mb_y){ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2327 MpegEncContext *thread_context= s2->thread_context[s->slice_count]; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2328 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2329 thread_context->start_mb_y= mb_y; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2330 thread_context->end_mb_y = s2->mb_height; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2331 if(s->slice_count){ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2332 s2->thread_context[s->slice_count-1]->end_mb_y= mb_y; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2333 ff_update_duplicate_context(thread_context, s2); |
| 2786 | 2334 } |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2335 init_get_bits(&thread_context->gb, buf_ptr, input_size*8); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2336 s->slice_count++; |
| 0 | 2337 } |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2338 buf_ptr += 2; //FIXME add minimum num of bytes per slice |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2339 }else{ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2340 ret = mpeg_decode_slice(s, mb_y, &buf_ptr, input_size); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2341 emms_c(); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2342 |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2343 if(ret < 0){ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2344 if(s2->resync_mb_x>=0 && s2->resync_mb_y>=0) |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2345 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2346 }else{ |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2347 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, AC_END|DC_END|MV_END); |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2348 } |
| 0 | 2349 } |
|
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2350 } |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2351 break; |
|
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
4070
diff
changeset
|
2352 } |
| 0 | 2353 } |
| 2354 } | |
| 2355 | |
| 2356 static int mpeg_decode_end(AVCodecContext *avctx) | |
| 2357 { | |
| 2358 Mpeg1Context *s = avctx->priv_data; | |
| 2359 | |
| 2360 if (s->mpeg_enc_ctx_allocated) | |
| 2361 MPV_common_end(&s->mpeg_enc_ctx); | |
| 2362 return 0; | |
| 2363 } | |
| 2364 | |
| 1423 | 2365 AVCodec mpeg1video_decoder = { |
| 2366 "mpeg1video", | |
| 0 | 2367 CODEC_TYPE_VIDEO, |
| 2368 CODEC_ID_MPEG1VIDEO, | |
| 2369 sizeof(Mpeg1Context), | |
| 2370 mpeg_decode_init, | |
| 2371 NULL, | |
| 2372 mpeg_decode_end, | |
| 2373 mpeg_decode_frame, | |
| 2453 | 2374 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, |
| 1368 | 2375 .flush= ff_mpeg_flush, |
| 0 | 2376 }; |
| 1381 | 2377 |
| 1423 | 2378 AVCodec mpeg2video_decoder = { |
| 2379 "mpeg2video", | |
| 2380 CODEC_TYPE_VIDEO, | |
| 2381 CODEC_ID_MPEG2VIDEO, | |
| 2382 sizeof(Mpeg1Context), | |
| 2383 mpeg_decode_init, | |
| 2384 NULL, | |
| 2385 mpeg_decode_end, | |
| 2386 mpeg_decode_frame, | |
| 2453 | 2387 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, |
| 1423 | 2388 .flush= ff_mpeg_flush, |
| 2389 }; | |
| 2390 | |
| 1615 | 2391 //legacy decoder |
| 2392 AVCodec mpegvideo_decoder = { | |
| 2393 "mpegvideo", | |
| 2394 CODEC_TYPE_VIDEO, | |
| 2395 CODEC_ID_MPEG2VIDEO, | |
| 2396 sizeof(Mpeg1Context), | |
| 2397 mpeg_decode_init, | |
| 2398 NULL, | |
| 2399 mpeg_decode_end, | |
| 2400 mpeg_decode_frame, | |
| 2453 | 2401 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, |
| 1615 | 2402 .flush= ff_mpeg_flush, |
| 2403 }; | |
| 2404 | |
| 1381 | 2405 #ifdef HAVE_XVMC |
| 2406 static int mpeg_mc_decode_init(AVCodecContext *avctx){ | |
| 2407 Mpeg1Context *s; | |
| 2408 | |
| 2967 | 2409 if( avctx->thread_count > 1) |
| 2076 | 2410 return -1; |
| 1381 | 2411 if( !(avctx->slice_flags & SLICE_FLAG_CODED_ORDER) ) |
| 2412 return -1; | |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
2413 if( !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD) ){ |
| 4652 | 2414 dprintf(avctx, "mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n"); |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
2415 } |
| 1381 | 2416 mpeg_decode_init(avctx); |
| 2417 s = avctx->priv_data; | |
| 2418 | |
| 2419 avctx->pix_fmt = PIX_FMT_XVMC_MPEG2_IDCT; | |
|
1580
628bf341e099
XvMC speedup by removing one memcpy and doing MB packing
iive
parents:
1550
diff
changeset
|
2420 avctx->xvmc_acceleration = 2;//2 - the blocks are packed! |
| 1381 | 2421 |
| 2422 return 0; | |
| 2423 } | |
| 2424 | |
| 2425 AVCodec mpeg_xvmc_decoder = { | |
| 2426 "mpegvideo_xvmc", | |
| 2427 CODEC_TYPE_VIDEO, | |
| 2428 CODEC_ID_MPEG2VIDEO_XVMC, | |
| 2429 sizeof(Mpeg1Context), | |
| 2430 mpeg_mc_decode_init, | |
| 2431 NULL, | |
| 2432 mpeg_decode_end, | |
| 2433 mpeg_decode_frame, | |
| 2453 | 2434 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY, |
|
1848
c72589baee53
initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents:
1841
diff
changeset
|
2435 .flush= ff_mpeg_flush, |
| 1381 | 2436 }; |
| 2437 | |
| 2438 #endif | |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
2439 |
| 2967 | 2440 /* this is ugly i know, but the alternative is too make |
|
1410
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
2441 hundreds of vars global and prefix them with ff_mpeg1_ |
|
524c904a66b8
PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
1409
diff
changeset
|
2442 which is far uglier. */ |
| 2967 | 2443 #include "mdec.c" |
