Mercurial > libavcodec.hg
annotate cavsdec.c @ 10960:10759fd39860 libavcodec
Gcc idiocy fixes related to filter_mb_edge*.
Change order of operands as gcc uses a hardcoded register per operand it seems
even for static functions
thus reducing unneeded moved (now functions try to pass the same argument in
the same spot).
Change signed int to unsigned int for array indexes as signed requires signed
extension while unsigned is free.
move the +52 up and merge it where it will end as a lea instruction, gcc always
splits the 52 out there turning the free +52 into an expensive one otherwise.
The changed code becomes a little faster.
author | michael |
---|---|
date | Fri, 22 Jan 2010 01:59:17 +0000 |
parents | d69eaf40d1b8 |
children | 9a793cb05a85 |
rev | line source |
---|---|
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
1 /* |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
2 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder. |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de> |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
9 * 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:
3524
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3524
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
16 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
17 * 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:
3524
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
5215 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
20 */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
21 |
3402 | 22 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8675
diff
changeset
|
23 * @file libavcodec/cavsdec.c |
3402 | 24 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder |
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de> | |
26 */ | |
27 | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
28 #include "avcodec.h" |
9428 | 29 #include "get_bits.h" |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
30 #include "golomb.h" |
4944 | 31 #include "cavs.h" |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
32 |
5250 | 33 static const uint8_t mv_scan[4] = { |
34 MV_FWD_X0,MV_FWD_X1, | |
35 MV_FWD_X2,MV_FWD_X3 | |
36 }; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
37 |
5250 | 38 static const uint8_t cbp_tab[64][2] = { |
39 {63, 0},{15,15},{31,63},{47,31},{ 0,16},{14,32},{13,47},{11,13}, | |
40 { 7,14},{ 5,11},{10,12},{ 8, 5},{12,10},{61, 7},{ 4,48},{55, 3}, | |
41 { 1, 2},{ 2, 8},{59, 4},{ 3, 1},{62,61},{ 9,55},{ 6,59},{29,62}, | |
42 {45,29},{51,27},{23,23},{39,19},{27,30},{46,28},{53, 9},{30, 6}, | |
43 {43,60},{37,21},{60,44},{16,26},{21,51},{28,35},{19,18},{35,20}, | |
44 {42,24},{26,53},{44,17},{32,37},{58,39},{24,45},{20,58},{17,43}, | |
45 {18,42},{48,46},{22,36},{33,33},{25,34},{49,40},{40,52},{36,49}, | |
46 {34,50},{50,56},{52,25},{54,22},{41,54},{56,57},{38,41},{57,38} | |
47 }; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
48 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
49 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
50 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
51 * motion vector prediction |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
52 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
53 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
54 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
55 static inline void store_mvs(AVSContext *h) { |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
56 h->col_mv[h->mbidx*4 + 0] = h->mv[MV_FWD_X0]; |
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
57 h->col_mv[h->mbidx*4 + 1] = h->mv[MV_FWD_X1]; |
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
58 h->col_mv[h->mbidx*4 + 2] = h->mv[MV_FWD_X2]; |
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
59 h->col_mv[h->mbidx*4 + 3] = h->mv[MV_FWD_X3]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
60 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
61 |
8605 | 62 static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw, |
63 cavs_vector *col_mv) { | |
64 cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
65 int den = h->direct_den[col_mv->ref]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
66 int m = col_mv->x >> 31; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
67 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
68 pmv_fw->dist = h->dist[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
69 pmv_bw->dist = h->dist[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
70 pmv_fw->ref = 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
71 pmv_bw->ref = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
72 /* scale the co-located motion vector according to its temporal span */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
73 pmv_fw->x = (((den+(den*col_mv->x*pmv_fw->dist^m)-m-1)>>14)^m)-m; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
74 pmv_bw->x = m-(((den+(den*col_mv->x*pmv_bw->dist^m)-m-1)>>14)^m); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
75 m = col_mv->y >> 31; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
76 pmv_fw->y = (((den+(den*col_mv->y*pmv_fw->dist^m)-m-1)>>14)^m)-m; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
77 pmv_bw->y = m-(((den+(den*col_mv->y*pmv_bw->dist^m)-m-1)>>14)^m); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
78 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
79 |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
80 static inline void mv_pred_sym(AVSContext *h, cavs_vector *src, enum cavs_block size) { |
8605 | 81 cavs_vector *dst = src + MV_BWD_OFFS; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
82 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
83 /* backward mv is the scaled and negated forward mv */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
84 dst->x = -((src->x * h->sym_factor + 256) >> 9); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
85 dst->y = -((src->y * h->sym_factor + 256) >> 9); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
86 dst->ref = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
87 dst->dist = h->dist[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
88 set_mvs(dst, size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
89 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
90 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
91 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
92 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
93 * residual data decoding |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
94 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
95 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
96 |
3402 | 97 /** kth-order exponential golomb code */ |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
98 static inline int get_ue_code(GetBitContext *gb, int order) { |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
99 if(order) { |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
100 int ret = get_ue_golomb(gb) << order; |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
101 return ret + get_bits(gb,order); |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
102 } |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
103 return get_ue_golomb(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
104 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
105 |
3402 | 106 /** |
107 * decode coefficients from one 8x8 block, dequantize, inverse transform | |
108 * and add them to sample block | |
109 * @param r pointer to 2D VLC table | |
110 * @param esc_golomb_order escape codes are k-golomb with this order k | |
111 * @param qp quantizer | |
112 * @param dst location of sample block | |
113 * @param stride line stride in frame buffer | |
114 */ | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
115 static int decode_residual_block(AVSContext *h, GetBitContext *gb, |
8331 | 116 const struct dec_2dvlc *r, int esc_golomb_order, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
117 int qp, uint8_t *dst, int stride) { |
5243 | 118 int i, level_code, esc_code, level, run, mask; |
6913 | 119 DCTELEM level_buf[65]; |
120 uint8_t run_buf[65]; | |
3524 | 121 DCTELEM *block = h->block; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
122 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
123 for(i=0;i<65;i++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
124 level_code = get_ue_code(gb,r->golomb_order); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
125 if(level_code >= ESCAPE_CODE) { |
3471 | 126 run = ((level_code - ESCAPE_CODE) >> 1) + 1; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
127 esc_code = get_ue_code(gb,esc_golomb_order); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
128 level = esc_code + (run > r->max_run ? 1 : r->level_add[run]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
129 while(level > r->inc_limit) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
130 r++; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
131 mask = -(level_code & 1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
132 level = (level^mask) - mask; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
133 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
134 level = r->rltab[level_code][0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
135 if(!level) //end of block signal |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
136 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
137 run = r->rltab[level_code][1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
138 r += r->rltab[level_code][2]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
139 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
140 level_buf[i] = level; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
141 run_buf[i] = run; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
142 } |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
143 if(dequant(h,level_buf, run_buf, block, ff_cavs_dequant_mul[qp], |
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
144 ff_cavs_dequant_shift[qp], i)) |
5243 | 145 return -1; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
146 h->s.dsp.cavs_idct8_add(dst,block,stride); |
8793 | 147 h->s.dsp.clear_block(block); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
148 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
149 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
150 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
151 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
152 static inline void decode_residual_chroma(AVSContext *h) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
153 if(h->cbp & (1<<4)) |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
154 decode_residual_block(h,&h->s.gb,ff_cavs_chroma_dec,0, |
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
155 ff_cavs_chroma_qp[h->qp],h->cu,h->c_stride); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
156 if(h->cbp & (1<<5)) |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
157 decode_residual_block(h,&h->s.gb,ff_cavs_chroma_dec,0, |
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
158 ff_cavs_chroma_qp[h->qp],h->cv,h->c_stride); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
159 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
160 |
3408
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
161 static inline int decode_residual_inter(AVSContext *h) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
162 int block; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
163 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
164 /* get coded block pattern */ |
3408
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
165 int cbp= get_ue_golomb(&h->s.gb); |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
166 if(cbp > 63){ |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
167 av_log(h->s.avctx, AV_LOG_ERROR, "illegal inter cbp\n"); |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
168 return -1; |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
169 } |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
170 h->cbp = cbp_tab[cbp][1]; |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
171 |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
172 /* get quantizer */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
173 if(h->cbp && !h->qp_fixed) |
3466 | 174 h->qp = (h->qp + get_se_golomb(&h->s.gb)) & 63; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
175 for(block=0;block<4;block++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
176 if(h->cbp & (1<<block)) |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
177 decode_residual_block(h,&h->s.gb,ff_cavs_inter_dec,0,h->qp, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
178 h->cy + h->luma_scan[block], h->l_stride); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
179 decode_residual_chroma(h); |
3408
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
180 |
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
181 return 0; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
182 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
183 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
184 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
185 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
186 * macroblock level |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
187 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
188 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
189 |
3415 | 190 static int decode_mb_i(AVSContext *h, int cbp_code) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
191 GetBitContext *gb = &h->s.gb; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
192 int block, pred_mode_uv; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
193 uint8_t top[18]; |
3472
0e0cffe06fb3
avoid double copying of left border in luma prediction
stefang
parents:
3471
diff
changeset
|
194 uint8_t *left = NULL; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
195 uint8_t *d; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
196 |
5401 | 197 ff_cavs_init_mb(h); |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
198 |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
199 /* get intra prediction modes from stream */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
200 for(block=0;block<4;block++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
201 int nA,nB,predpred; |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
202 int pos = ff_cavs_scan3x3[block]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
203 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
204 nA = h->pred_mode_Y[pos-1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
205 nB = h->pred_mode_Y[pos-3]; |
3409 | 206 predpred = FFMIN(nA,nB); |
207 if(predpred == NOT_AVAIL) // if either is not available | |
208 predpred = INTRA_L_LP; | |
209 if(!get_bits1(gb)){ | |
210 int rem_mode= get_bits(gb, 2); | |
211 predpred = rem_mode + (rem_mode >= predpred); | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
212 } |
3409 | 213 h->pred_mode_Y[pos] = predpred; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
214 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
215 pred_mode_uv = get_ue_golomb(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
216 if(pred_mode_uv > 6) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
217 av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra chroma pred mode\n"); |
3410
3b72265410f3
return -1 on bitstream errors instead of continuing, as the following stuff almost always will be useless until the next startcode
michael
parents:
3409
diff
changeset
|
218 return -1; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
219 } |
5401 | 220 ff_cavs_modify_mb_i(h, &pred_mode_uv); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
221 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
222 /* get coded block pattern */ |
3415 | 223 if(h->pic_type == FF_I_TYPE) |
224 cbp_code = get_ue_golomb(gb); | |
225 if(cbp_code > 63){ | |
226 av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n"); | |
227 return -1; | |
3408
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
228 } |
3415 | 229 h->cbp = cbp_tab[cbp_code][0]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
230 if(h->cbp && !h->qp_fixed) |
3466 | 231 h->qp = (h->qp + get_se_golomb(gb)) & 63; //qp_delta |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
232 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
233 /* luma intra prediction interleaved with residual decode/transform/add */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
234 for(block=0;block<4;block++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
235 d = h->cy + h->luma_scan[block]; |
5401 | 236 ff_cavs_load_intra_pred_luma(h, top, &left, block); |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
237 h->intra_pred_l[h->pred_mode_Y[ff_cavs_scan3x3[block]]] |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
238 (d, top, left, h->l_stride); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
239 if(h->cbp & (1<<block)) |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
240 decode_residual_block(h,gb,ff_cavs_intra_dec,1,h->qp,d,h->l_stride); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
241 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
242 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
243 /* chroma intra prediction */ |
5401 | 244 ff_cavs_load_intra_pred_chroma(h); |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
245 h->intra_pred_c[pred_mode_uv](h->cu, &h->top_border_u[h->mbx*10], |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
246 h->left_border_u, h->c_stride); |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
247 h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx*10], |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
248 h->left_border_v, h->c_stride); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
249 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
250 decode_residual_chroma(h); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
251 ff_cavs_filter(h,I_8X8); |
5241
74b6423a5a0d
setting special motion vectors in intra macroblocks
stefang
parents:
5240
diff
changeset
|
252 set_mv_intra(h); |
3408
73c648ae1c74
check cbp for validity, avoids possible out of array reads / segfaults
michael
parents:
3407
diff
changeset
|
253 return 0; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
254 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
255 |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
256 static void decode_mb_p(AVSContext *h, enum cavs_mb mb_type) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
257 GetBitContext *gb = &h->s.gb; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
258 int ref[4]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
259 |
5401 | 260 ff_cavs_init_mb(h); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
261 switch(mb_type) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
262 case P_SKIP: |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
263 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_PSKIP, BLK_16X16, 0); |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
264 break; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
265 case P_16X16: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
266 ref[0] = h->ref_flag ? 0 : get_bits1(gb); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
267 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16,ref[0]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
268 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
269 case P_16X8: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
270 ref[0] = h->ref_flag ? 0 : get_bits1(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
271 ref[2] = h->ref_flag ? 0 : get_bits1(gb); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
272 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, ref[0]); |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
273 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, ref[2]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
274 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
275 case P_8X16: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
276 ref[0] = h->ref_flag ? 0 : get_bits1(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
277 ref[1] = h->ref_flag ? 0 : get_bits1(gb); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
278 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, ref[0]); |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
279 ff_cavs_mv(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_TOPRIGHT,BLK_8X16, ref[1]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
280 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
281 case P_8X8: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
282 ref[0] = h->ref_flag ? 0 : get_bits1(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
283 ref[1] = h->ref_flag ? 0 : get_bits1(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
284 ref[2] = h->ref_flag ? 0 : get_bits1(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
285 ref[3] = h->ref_flag ? 0 : get_bits1(gb); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
286 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_MEDIAN, BLK_8X8, ref[0]); |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
287 ff_cavs_mv(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_MEDIAN, BLK_8X8, ref[1]); |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
288 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_X1, MV_PRED_MEDIAN, BLK_8X8, ref[2]); |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
289 ff_cavs_mv(h, MV_FWD_X3, MV_FWD_X0, MV_PRED_MEDIAN, BLK_8X8, ref[3]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
290 } |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
291 ff_cavs_inter(h, mb_type); |
5240 | 292 set_intra_mode_default(h); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
293 store_mvs(h); |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
294 if(mb_type != P_SKIP) |
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
295 decode_residual_inter(h); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
296 ff_cavs_filter(h,mb_type); |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
297 h->col_type_base[h->mbidx] = mb_type; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
298 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
299 |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
300 static void decode_mb_b(AVSContext *h, enum cavs_mb mb_type) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
301 int block; |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
302 enum cavs_sub_mb sub_type[4]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
303 int flags; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
304 |
5401 | 305 ff_cavs_init_mb(h); |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
306 |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
307 /* reset all MVs */ |
5235 | 308 h->mv[MV_FWD_X0] = ff_cavs_dir_mv; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
309 set_mvs(&h->mv[MV_FWD_X0], BLK_16X16); |
5235 | 310 h->mv[MV_BWD_X0] = ff_cavs_dir_mv; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
311 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
312 switch(mb_type) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
313 case B_SKIP: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
314 case B_DIRECT: |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
315 if(!h->col_type_base[h->mbidx]) { |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
316 /* intra MB at co-location, do in-plane prediction */ |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
317 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_BSKIP, BLK_16X16, 1); |
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
318 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_BSKIP, BLK_16X16, 0); |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
319 } else |
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
320 /* direct prediction from co-located P MB, block-wise */ |
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
321 for(block=0;block<4;block++) |
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
322 mv_pred_direct(h,&h->mv[mv_scan[block]], |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
323 &h->col_mv[h->mbidx*4 + block]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
324 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
325 case B_FWD_16X16: |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
326 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
327 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
328 case B_SYM_16X16: |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
329 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
330 mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X16); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
331 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
332 case B_BWD_16X16: |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
333 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_MEDIAN, BLK_16X16, 0); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
334 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
335 case B_8X8: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
336 for(block=0;block<4;block++) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
337 sub_type[block] = get_bits(&h->s.gb,2); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
338 for(block=0;block<4;block++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
339 switch(sub_type[block]) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
340 case B_SUB_DIRECT: |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
341 if(!h->col_type_base[h->mbidx]) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
342 /* intra MB at co-location, do in-plane prediction */ |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
343 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
344 MV_PRED_BSKIP, BLK_8X8, 1); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
345 ff_cavs_mv(h, mv_scan[block]+MV_BWD_OFFS, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
346 mv_scan[block]-3+MV_BWD_OFFS, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
347 MV_PRED_BSKIP, BLK_8X8, 0); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
348 } else |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
349 mv_pred_direct(h,&h->mv[mv_scan[block]], |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
350 &h->col_mv[h->mbidx*4 + block]); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
351 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
352 case B_SUB_FWD: |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
353 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
354 MV_PRED_MEDIAN, BLK_8X8, 1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
355 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
356 case B_SUB_SYM: |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
357 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
358 MV_PRED_MEDIAN, BLK_8X8, 1); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
359 mv_pred_sym(h, &h->mv[mv_scan[block]], BLK_8X8); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
360 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
361 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
362 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
363 for(block=0;block<4;block++) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
364 if(sub_type[block] == B_SUB_BWD) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
365 ff_cavs_mv(h, mv_scan[block]+MV_BWD_OFFS, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
366 mv_scan[block]+MV_BWD_OFFS-3, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
367 MV_PRED_MEDIAN, BLK_8X8, 0); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
368 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
369 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
370 default: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
371 assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8)); |
5249
dc2579bede07
prepare splitting decoder-only parts into own file:
stefang
parents:
5244
diff
changeset
|
372 flags = ff_cavs_partition_flags[mb_type]; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
373 if(mb_type & 1) { /* 16x8 macroblock types */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
374 if(flags & FWD0) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
375 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1); |
3469 | 376 if(flags & SYM0) |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
377 mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X8); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
378 if(flags & FWD1) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
379 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, 1); |
3469 | 380 if(flags & SYM1) |
381 mv_pred_sym(h, &h->mv[MV_FWD_X2], BLK_16X8); | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
382 if(flags & BWD0) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
383 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_TOP, BLK_16X8, 0); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
384 if(flags & BWD1) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
385 ff_cavs_mv(h, MV_BWD_X2, MV_BWD_A1, MV_PRED_LEFT, BLK_16X8, 0); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
386 } else { /* 8x16 macroblock types */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
387 if(flags & FWD0) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
388 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, 1); |
3469 | 389 if(flags & SYM0) |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
390 mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_8X16); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
391 if(flags & FWD1) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
392 ff_cavs_mv(h,MV_FWD_X1,MV_FWD_C2,MV_PRED_TOPRIGHT,BLK_8X16,1); |
3469 | 393 if(flags & SYM1) |
394 mv_pred_sym(h, &h->mv[MV_FWD_X1], BLK_8X16); | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
395 if(flags & BWD0) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
396 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_B3, MV_PRED_LEFT, BLK_8X16, 0); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
397 if(flags & BWD1) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
398 ff_cavs_mv(h,MV_BWD_X1,MV_BWD_C2,MV_PRED_TOPRIGHT,BLK_8X16,0); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
399 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
400 } |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
401 ff_cavs_inter(h, mb_type); |
5240 | 402 set_intra_mode_default(h); |
3403
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
403 if(mb_type != B_SKIP) |
fc0eb7836ccb
cleanup macroblock layer: merged decode of skipped MBs
stefang
parents:
3402
diff
changeset
|
404 decode_residual_inter(h); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
405 ff_cavs_filter(h,mb_type); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
406 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
407 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
408 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
409 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
410 * slice level |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
411 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
412 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
413 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
414 static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
415 if(h->stc > 0xAF) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
416 av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
417 h->mby = h->stc; |
8796
c6dd98bff427
introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents:
8795
diff
changeset
|
418 h->mbidx = h->mby*h->mb_width; |
8795 | 419 |
420 /* mark top macroblocks as unavailable */ | |
421 h->flags &= ~(B_AVAIL|C_AVAIL); | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
422 if((h->mby == 0) && (!h->qp_fixed)){ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
423 h->qp_fixed = get_bits1(gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
424 h->qp = get_bits(gb,6); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
425 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
426 /* inter frame or second slice can have weighting params */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
427 if((h->pic_type != FF_I_TYPE) || (!h->pic_structure && h->mby >= h->mb_width/2)) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
428 if(get_bits1(gb)) { //slice_weighting_flag |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
429 av_log(h->s.avctx, AV_LOG_ERROR, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
430 "weighted prediction not yet supported\n"); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
431 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
432 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
433 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
434 |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
435 static inline int check_for_slice(AVSContext *h) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
436 GetBitContext *gb = &h->s.gb; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
437 int align; |
8795 | 438 |
439 if(h->mbx) | |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
440 return 0; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
441 align = (-get_bits_count(gb)) & 7; |
9023 | 442 /* check for stuffing byte */ |
443 if(!align && (show_bits(gb,8) == 0x80)) | |
9897 | 444 align = 8; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
445 if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) { |
5519 | 446 skip_bits_long(gb,24+align); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
447 h->stc = get_bits(gb,8); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
448 decode_slice_header(h,gb); |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
449 return 1; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
450 } |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
451 return 0; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
452 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
453 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
454 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
455 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
456 * frame level |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
457 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
458 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
459 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
460 static int decode_pic(AVSContext *h) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
461 MpegEncContext *s = &h->s; |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
462 int skip_count = -1; |
8606
c3a96cea3453
rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents:
8605
diff
changeset
|
463 enum cavs_mb mb_type; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
464 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
465 if (!s->context_initialized) { |
3524 | 466 s->avctx->idct_algo = FF_IDCT_CAVS; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
467 if (MPV_common_init(s) < 0) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
468 return -1; |
3524 | 469 ff_init_scantable(s->dsp.idct_permutation,&h->scantable,ff_zigzag_direct); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
470 } |
5519 | 471 skip_bits(&s->gb,16);//bbv_dwlay |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
472 if(h->stc == PIC_PB_START_CODE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
473 h->pic_type = get_bits(&s->gb,2) + FF_I_TYPE; |
3466 | 474 if(h->pic_type > FF_B_TYPE) { |
475 av_log(s->avctx, AV_LOG_ERROR, "illegal picture type\n"); | |
476 return -1; | |
477 } | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
478 /* make sure we have the reference frames we need */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
479 if(!h->DPB[0].data[0] || |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
480 (!h->DPB[1].data[0] && h->pic_type == FF_B_TYPE)) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
481 return -1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
482 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
483 h->pic_type = FF_I_TYPE; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
484 if(get_bits1(&s->gb)) |
8792 | 485 skip_bits(&s->gb,24);//time_code |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
486 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
487 /* release last B frame */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
488 if(h->picture.data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
489 s->avctx->release_buffer(s->avctx, (AVFrame *)&h->picture); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
490 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
491 s->avctx->get_buffer(s->avctx, (AVFrame *)&h->picture); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
492 ff_cavs_init_pic(h); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
493 h->picture.poc = get_bits(&s->gb,8)*2; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
494 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
495 /* get temporal distances and MV scaling factors */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
496 if(h->pic_type != FF_B_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
497 h->dist[0] = (h->picture.poc - h->DPB[0].poc + 512) % 512; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
498 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
499 h->dist[0] = (h->DPB[0].poc - h->picture.poc + 512) % 512; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
500 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
501 h->dist[1] = (h->picture.poc - h->DPB[1].poc + 512) % 512; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
502 h->scale_den[0] = h->dist[0] ? 512/h->dist[0] : 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
503 h->scale_den[1] = h->dist[1] ? 512/h->dist[1] : 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
504 if(h->pic_type == FF_B_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
505 h->sym_factor = h->dist[0]*h->scale_den[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
506 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
507 h->direct_den[0] = h->dist[0] ? 16384/h->dist[0] : 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
508 h->direct_den[1] = h->dist[1] ? 16384/h->dist[1] : 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
509 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
510 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
511 if(s->low_delay) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
512 get_ue_golomb(&s->gb); //bbv_check_times |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
513 h->progressive = get_bits1(&s->gb); |
8794 | 514 h->pic_structure = 1; |
515 if(!h->progressive) | |
516 h->pic_structure = get_bits1(&s->gb); | |
517 if(!h->pic_structure && h->stc == PIC_PB_START_CODE) | |
5519 | 518 skip_bits1(&s->gb); //advanced_pred_mode_disable |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
519 skip_bits1(&s->gb); //top_field_first |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
520 skip_bits1(&s->gb); //repeat_first_field |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
521 h->qp_fixed = get_bits1(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
522 h->qp = get_bits(&s->gb,6); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
523 if(h->pic_type == FF_I_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
524 if(!h->progressive && !h->pic_structure) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
525 skip_bits1(&s->gb);//what is this? |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
526 skip_bits(&s->gb,4); //reserved bits |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
527 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
528 if(!(h->pic_type == FF_B_TYPE && h->pic_structure == 1)) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
529 h->ref_flag = get_bits1(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
530 skip_bits(&s->gb,4); //reserved bits |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
531 h->skip_mode_flag = get_bits1(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
532 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
533 h->loop_filter_disable = get_bits1(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
534 if(!h->loop_filter_disable && get_bits1(&s->gb)) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
535 h->alpha_offset = get_se_golomb(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
536 h->beta_offset = get_se_golomb(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
537 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
538 h->alpha_offset = h->beta_offset = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
539 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
540 if(h->pic_type == FF_I_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
541 do { |
8795 | 542 check_for_slice(h); |
3415 | 543 decode_mb_i(h, 0); |
5401 | 544 } while(ff_cavs_next_mb(h)); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
545 } else if(h->pic_type == FF_P_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
546 do { |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
547 if(check_for_slice(h)) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
548 skip_count = -1; |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
549 if(h->skip_mode_flag && (skip_count < 0)) |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
550 skip_count = get_ue_golomb(&s->gb); |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
551 if(h->skip_mode_flag && skip_count--) { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
552 decode_mb_p(h,P_SKIP); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
553 } else { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
554 mb_type = get_ue_golomb(&s->gb) + P_SKIP + h->skip_mode_flag; |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
555 if(mb_type > P_8X8) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
556 decode_mb_i(h, mb_type - P_8X8 - 1); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
557 else |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
558 decode_mb_p(h,mb_type); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
559 } |
5401 | 560 } while(ff_cavs_next_mb(h)); |
3402 | 561 } else { /* FF_B_TYPE */ |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
562 do { |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
563 if(check_for_slice(h)) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
564 skip_count = -1; |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
565 if(h->skip_mode_flag && (skip_count < 0)) |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
566 skip_count = get_ue_golomb(&s->gb); |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
567 if(h->skip_mode_flag && skip_count--) { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
568 decode_mb_b(h,B_SKIP); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
569 } else { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
570 mb_type = get_ue_golomb(&s->gb) + B_SKIP + h->skip_mode_flag; |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
571 if(mb_type > B_8X8) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
572 decode_mb_i(h, mb_type - B_8X8 - 1); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
573 else |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
574 decode_mb_b(h,mb_type); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
575 } |
5401 | 576 } while(ff_cavs_next_mb(h)); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
577 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
578 if(h->pic_type != FF_B_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
579 if(h->DPB[1].data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
580 s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]); |
8608 | 581 h->DPB[1] = h->DPB[0]; |
582 h->DPB[0] = h->picture; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
583 memset(&h->picture,0,sizeof(Picture)); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
584 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
585 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
586 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
587 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
588 /***************************************************************************** |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
589 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
590 * headers and interface |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
591 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
592 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
593 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
594 static int decode_seq_header(AVSContext *h) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
595 MpegEncContext *s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
596 int frame_rate_code; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
597 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
598 h->profile = get_bits(&s->gb,8); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
599 h->level = get_bits(&s->gb,8); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
600 skip_bits1(&s->gb); //progressive sequence |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
601 s->width = get_bits(&s->gb,14); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
602 s->height = get_bits(&s->gb,14); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
603 skip_bits(&s->gb,2); //chroma format |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
604 skip_bits(&s->gb,3); //sample_precision |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
605 h->aspect_ratio = get_bits(&s->gb,4); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
606 frame_rate_code = get_bits(&s->gb,4); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
607 skip_bits(&s->gb,18);//bit_rate_lower |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
608 skip_bits1(&s->gb); //marker_bit |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
609 skip_bits(&s->gb,12);//bit_rate_upper |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
610 s->low_delay = get_bits1(&s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
611 h->mb_width = (s->width + 15) >> 4; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
612 h->mb_height = (s->height + 15) >> 4; |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
613 h->s.avctx->time_base.den = ff_frame_rate_tab[frame_rate_code].num; |
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
614 h->s.avctx->time_base.num = ff_frame_rate_tab[frame_rate_code].den; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
615 h->s.avctx->width = s->width; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
616 h->s.avctx->height = s->height; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
617 if(!h->top_qp) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
618 ff_cavs_init_top_lines(h); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
619 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
620 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
621 |
4178
f623a9939995
rename ff_cavs_flush to cavs_flush and make it static
stefang
parents:
4177
diff
changeset
|
622 static void cavs_flush(AVCodecContext * avctx) { |
3382 | 623 AVSContext *h = avctx->priv_data; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
624 h->got_keyframe = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
625 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
626 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
627 static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9023
diff
changeset
|
628 AVPacket *avpkt) { |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9023
diff
changeset
|
629 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9023
diff
changeset
|
630 int buf_size = avpkt->size; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
631 AVSContext *h = avctx->priv_data; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
632 MpegEncContext *s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
633 int input_size; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
634 const uint8_t *buf_end; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
635 const uint8_t *buf_ptr; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
636 AVFrame *picture = data; |
5574
33718fb21437
Initialize the "stc" variable before using it in ff_find_start_code()
lucabe
parents:
5519
diff
changeset
|
637 uint32_t stc = -1; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
638 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
639 s->avctx = avctx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
640 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
641 if (buf_size == 0) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
642 if(!s->low_delay && h->DPB[0].data[0]) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
643 *data_size = sizeof(AVPicture); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
644 *picture = *(AVFrame *) &h->DPB[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
645 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
646 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
647 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
648 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
649 buf_ptr = buf; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
650 buf_end = buf + buf_size; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
651 for(;;) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
652 buf_ptr = ff_find_start_code(buf_ptr,buf_end, &stc); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
653 if(stc & 0xFFFFFE00) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
654 return FFMAX(0, buf_ptr - buf - s->parse_context.last_index); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
655 input_size = (buf_end - buf_ptr)*8; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
656 switch(stc) { |
4917
6c457e692336
avoid a clash between two definitions of SEQ_START_CODE
aurel
parents:
4594
diff
changeset
|
657 case CAVS_START_CODE: |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
658 init_get_bits(&s->gb, buf_ptr, input_size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
659 decode_seq_header(h); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
660 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
661 case PIC_I_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
662 if(!h->got_keyframe) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
663 if(h->DPB[0].data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
664 avctx->release_buffer(avctx, (AVFrame *)&h->DPB[0]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
665 if(h->DPB[1].data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
666 avctx->release_buffer(avctx, (AVFrame *)&h->DPB[1]); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
667 h->got_keyframe = 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
668 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
669 case PIC_PB_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
670 *data_size = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
671 if(!h->got_keyframe) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
672 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
673 init_get_bits(&s->gb, buf_ptr, input_size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
674 h->stc = stc; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
675 if(decode_pic(h)) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
676 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
677 *data_size = sizeof(AVPicture); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
678 if(h->pic_type != FF_B_TYPE) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
679 if(h->DPB[1].data[0]) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
680 *picture = *(AVFrame *) &h->DPB[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
681 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
682 *data_size = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
683 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
684 } else |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
685 *picture = *(AVFrame *) &h->picture; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
686 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
687 case EXT_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
688 //mpeg_decode_extension(avctx,buf_ptr, input_size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
689 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
690 case USER_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
691 //mpeg_decode_user_data(avctx,buf_ptr, input_size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
692 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
693 default: |
8791
7798afcf0b24
do not check for minimum slice start code, 0x00000100 is valid
stefang
parents:
8718
diff
changeset
|
694 if (stc <= SLICE_MAX_START_CODE) { |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
695 init_get_bits(&s->gb, buf_ptr, input_size); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
696 decode_slice_header(h, &s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
697 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
698 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
699 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
700 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
701 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
702 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
703 AVCodec cavs_decoder = { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
704 "cavs", |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
705 CODEC_TYPE_VIDEO, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
706 CODEC_ID_CAVS, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
707 sizeof(AVSContext), |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
708 ff_cavs_init, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
709 NULL, |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
710 ff_cavs_end, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
711 cavs_decode_frame, |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
712 CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
4178
f623a9939995
rename ff_cavs_flush to cavs_flush and make it static
stefang
parents:
4177
diff
changeset
|
713 .flush= cavs_flush, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6913
diff
changeset
|
714 .long_name= NULL_IF_CONFIG_SMALL("Chinese AVS video (AVS1-P2, JiZhun profile)"), |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
715 }; |