Mercurial > libavcodec.hg
annotate cavsdec.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 9a793cb05a85 |
children | 8a4984c5cacc |
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 |
11179
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
486 /* old sample clips were all progressive and no low_delay, |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
487 bump stream revision if detected otherwise */ |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
488 if((s->low_delay) || !(show_bits(&s->gb,9) & 1)) |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
489 h->stream_revision = 1; |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
490 /* similarly test top_field_first and repeat_first_field */ |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
491 else if(show_bits(&s->gb,11) & 3) |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
492 h->stream_revision = 1; |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
493 if(h->stream_revision > 0) |
9a793cb05a85
add heuristic to discern the old sample clips from streams encoded
stefang
parents:
9897
diff
changeset
|
494 skip_bits(&s->gb,1); //marker_bit |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
495 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
496 /* release last B frame */ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
497 if(h->picture.data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
498 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
|
499 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
500 s->avctx->get_buffer(s->avctx, (AVFrame *)&h->picture); |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
501 ff_cavs_init_pic(h); |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
502 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
|
503 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
504 /* 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
|
505 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
|
506 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
|
507 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
508 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
|
509 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
510 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
|
511 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
|
512 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
|
513 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
|
514 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
|
515 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
516 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
|
517 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
|
518 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
519 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
520 if(s->low_delay) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
521 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
|
522 h->progressive = get_bits1(&s->gb); |
8794 | 523 h->pic_structure = 1; |
524 if(!h->progressive) | |
525 h->pic_structure = get_bits1(&s->gb); | |
526 if(!h->pic_structure && h->stc == PIC_PB_START_CODE) | |
5519 | 527 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
|
528 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
|
529 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
|
530 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
|
531 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
|
532 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
|
533 if(!h->progressive && !h->pic_structure) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
534 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
|
535 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
|
536 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
537 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
|
538 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
|
539 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
|
540 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
|
541 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
542 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
|
543 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
|
544 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
|
545 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
|
546 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
547 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
|
548 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
549 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
|
550 do { |
8795 | 551 check_for_slice(h); |
3415 | 552 decode_mb_i(h, 0); |
5401 | 553 } 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
|
554 } 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
|
555 do { |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
556 if(check_for_slice(h)) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
557 skip_count = -1; |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
558 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
|
559 skip_count = get_ue_golomb(&s->gb); |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
560 if(h->skip_mode_flag && skip_count--) { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
561 decode_mb_p(h,P_SKIP); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
562 } else { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
563 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
|
564 if(mb_type > P_8X8) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
565 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
|
566 else |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
567 decode_mb_p(h,mb_type); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
568 } |
5401 | 569 } while(ff_cavs_next_mb(h)); |
3402 | 570 } else { /* FF_B_TYPE */ |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
571 do { |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
572 if(check_for_slice(h)) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
573 skip_count = -1; |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
574 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
|
575 skip_count = get_ue_golomb(&s->gb); |
9022
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
576 if(h->skip_mode_flag && skip_count--) { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
577 decode_mb_b(h,B_SKIP); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
578 } else { |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
579 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
|
580 if(mb_type > B_8X8) |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
581 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
|
582 else |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
583 decode_mb_b(h,mb_type); |
2b92a8c404c9
change macroblock loop in inter frames so that after a
stefang
parents:
8796
diff
changeset
|
584 } |
5401 | 585 } 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
|
586 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
587 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
|
588 if(h->DPB[1].data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
589 s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]); |
8608 | 590 h->DPB[1] = h->DPB[0]; |
591 h->DPB[0] = h->picture; | |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
592 memset(&h->picture,0,sizeof(Picture)); |
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 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
595 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
596 |
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 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
599 * headers and interface |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
600 * |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
601 ****************************************************************************/ |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
602 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
603 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
|
604 MpegEncContext *s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
605 int frame_rate_code; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
606 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
607 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
|
608 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
|
609 skip_bits1(&s->gb); //progressive sequence |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
610 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
|
611 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
|
612 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
|
613 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
|
614 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
|
615 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
|
616 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
|
617 skip_bits1(&s->gb); //marker_bit |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
618 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
|
619 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
|
620 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
|
621 h->mb_height = (s->height + 15) >> 4; |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
622 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
|
623 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
|
624 h->s.avctx->width = s->width; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
625 h->s.avctx->height = s->height; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
626 if(!h->top_qp) |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
627 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
|
628 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
629 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
630 |
4178
f623a9939995
rename ff_cavs_flush to cavs_flush and make it static
stefang
parents:
4177
diff
changeset
|
631 static void cavs_flush(AVCodecContext * avctx) { |
3382 | 632 AVSContext *h = avctx->priv_data; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
633 h->got_keyframe = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
634 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
635 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
636 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
|
637 AVPacket *avpkt) { |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9023
diff
changeset
|
638 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9023
diff
changeset
|
639 int buf_size = avpkt->size; |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
640 AVSContext *h = avctx->priv_data; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
641 MpegEncContext *s = &h->s; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
642 int input_size; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
643 const uint8_t *buf_end; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
644 const uint8_t *buf_ptr; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
645 AVFrame *picture = data; |
5574
33718fb21437
Initialize the "stc" variable before using it in ff_find_start_code()
lucabe
parents:
5519
diff
changeset
|
646 uint32_t stc = -1; |
3380
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 s->avctx = avctx; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
649 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
650 if (buf_size == 0) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
651 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
|
652 *data_size = sizeof(AVPicture); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
653 *picture = *(AVFrame *) &h->DPB[0]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
654 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
655 return 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
656 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
657 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
658 buf_ptr = buf; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
659 buf_end = buf + buf_size; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
660 for(;;) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
661 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
|
662 if(stc & 0xFFFFFE00) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
663 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
|
664 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
|
665 switch(stc) { |
4917
6c457e692336
avoid a clash between two definitions of SEQ_START_CODE
aurel
parents:
4594
diff
changeset
|
666 case CAVS_START_CODE: |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
667 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
|
668 decode_seq_header(h); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
669 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
670 case PIC_I_START_CODE: |
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 if(h->DPB[0].data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
673 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
|
674 if(h->DPB[1].data[0]) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
675 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
|
676 h->got_keyframe = 1; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
677 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
678 case PIC_PB_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
679 *data_size = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
680 if(!h->got_keyframe) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
681 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
682 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
|
683 h->stc = stc; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
684 if(decode_pic(h)) |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
685 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
686 *data_size = sizeof(AVPicture); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
687 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
|
688 if(h->DPB[1].data[0]) { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
689 *picture = *(AVFrame *) &h->DPB[1]; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
690 } else { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
691 *data_size = 0; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
692 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
693 } else |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
694 *picture = *(AVFrame *) &h->picture; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
695 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
696 case EXT_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
697 //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
|
698 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
699 case USER_START_CODE: |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
700 //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
|
701 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
702 default: |
8791
7798afcf0b24
do not check for minimum slice start code, 0x00000100 is valid
stefang
parents:
8718
diff
changeset
|
703 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
|
704 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
|
705 decode_slice_header(h, &s->gb); |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
706 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
707 break; |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
708 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
709 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
710 } |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
711 |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
712 AVCodec cavs_decoder = { |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
713 "cavs", |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
714 CODEC_TYPE_VIDEO, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
715 CODEC_ID_CAVS, |
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
716 sizeof(AVSContext), |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
717 ff_cavs_init, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
718 NULL, |
5244
eeba62cd2181
prepare splitting decoder-only parts into own file:
stefang
parents:
5243
diff
changeset
|
719 ff_cavs_end, |
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
720 cavs_decode_frame, |
3395
adccbf4a1040
CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents:
3382
diff
changeset
|
721 CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
4178
f623a9939995
rename ff_cavs_flush to cavs_flush and make it static
stefang
parents:
4177
diff
changeset
|
722 .flush= cavs_flush, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6913
diff
changeset
|
723 .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
|
724 }; |