annotate cavsdec.c @ 5311:7742d5411c9d libavcodec

AC-3 decoder, soc revision 48, Aug 16 11:27:49 2006 UTC by cloud9 I realized that the bug was not in the imdct routine but in the get_transform_coeffs. Fixed it. Code now uses the ffmpeg's imdct routines. All the mplayer's ac3 samples are decoded successfully. Also improved downmixing. Now all the downmixing coeffcients for channels are normalized such that the sum of coefficients used to construct the output for single channel never exceeds 1.0.
author jbr
date Sat, 14 Jul 2007 15:58:42 +0000
parents 2a3d31a8c66f
children cb5d5d2ee6fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 4945
diff changeset
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
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
22 /**
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
23 * @file cavs.c
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
24 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de>
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
26 */
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
27
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
28 #include "avcodec.h"
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
29 #include "bitstream.h"
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
30 #include "golomb.h"
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents: 4931
diff changeset
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
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
33 static const uint8_t mv_scan[4] = {
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
34 MV_FWD_X0,MV_FWD_X1,
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
35 MV_FWD_X2,MV_FWD_X3
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
36 };
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
37
5250
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
38 static const uint8_t cbp_tab[64][2] = {
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
39 {63, 0},{15,15},{31,63},{47,31},{ 0,16},{14,32},{13,47},{11,13},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
40 { 7,14},{ 5,11},{10,12},{ 8, 5},{12,10},{61, 7},{ 4,48},{55, 3},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
41 { 1, 2},{ 2, 8},{59, 4},{ 3, 1},{62,61},{ 9,55},{ 6,59},{29,62},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
42 {45,29},{51,27},{23,23},{39,19},{27,30},{46,28},{53, 9},{30, 6},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
43 {43,60},{37,21},{60,44},{16,26},{21,51},{28,35},{19,18},{35,20},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
44 {42,24},{26,53},{44,17},{32,37},{58,39},{24,45},{20,58},{17,43},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
45 {18,42},{48,46},{22,36},{33,33},{25,34},{49,40},{40,52},{36,49},
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
46 {34,50},{50,56},{52,25},{54,22},{41,54},{56,57},{38,41},{57,38}
2a3d31a8c66f split decoder-specific parts into their own file
stefang
parents: 5249
diff changeset
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) {
3381
62e51b7a1b36 get rid of veccpy(), replace with simple assignment
mru
parents: 3380
diff changeset
56 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 0] = h->mv[MV_FWD_X0];
62e51b7a1b36 get rid of veccpy(), replace with simple assignment
mru
parents: 3380
diff changeset
57 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 1] = h->mv[MV_FWD_X1];
62e51b7a1b36 get rid of veccpy(), replace with simple assignment
mru
parents: 3380
diff changeset
58 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 2] = h->mv[MV_FWD_X2];
62e51b7a1b36 get rid of veccpy(), replace with simple assignment
mru
parents: 3380
diff changeset
59 h->col_mv[(h->mby*h->mb_width + h->mbx)*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
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
62 static inline void mv_pred_direct(AVSContext *h, vector_t *pmv_fw,
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
63 vector_t *col_mv) {
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
64 vector_t *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
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
80 static inline void mv_pred_sym(AVSContext *h, vector_t *src, enum block_t size) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
81 vector_t *dst = src + MV_BWD_OFFS;
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
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
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
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
106 /**
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
107 * decode coefficients from one 8x8 block, dequantize, inverse transform
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
108 * and add them to sample block
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
109 * @param r pointer to 2D VLC table
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
110 * @param esc_golomb_order escape codes are k-golomb with this order k
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
111 * @param qp quantizer
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
112 * @param dst location of sample block
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
113 * @param stride line stride in frame buffer
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
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,
5242
deb5b8213d4e cosmetic: rename VLC tables to make clear they
stefang
parents: 5241
diff changeset
116 const dec_2dvlc_t *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
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
118 int i, level_code, esc_code, level, run, mask;
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
119 DCTELEM level_buf[64];
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
120 uint8_t run_buf[64];
3524
419409926166 some MMX optimizations for the CAVS decoder
stefang
parents: 3472
diff changeset
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
c2db6e76b269 replace run by run+1 in VLC tables
stefang
parents: 3469
diff changeset
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
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
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);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
147 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
148 }
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 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
152 if(h->cbp & (1<<4))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
153 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
154 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
155 if(h->cbp & (1<<5))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
156 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
157 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
158 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
159
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
160 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
161 int block;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
162
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
163 /* get coded block pattern */
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
164 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
165 if(cbp > 63){
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
166 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
167 return -1;
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
168 }
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
169 h->cbp = cbp_tab[cbp][1];
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
170
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
171 /* get quantizer */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
172 if(h->cbp && !h->qp_fixed)
3466
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
173 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
174 for(block=0;block<4;block++)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
175 if(h->cbp & (1<<block))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
176 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
177 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
178 decode_residual_chroma(h);
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
179
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
180 return 0;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
181 }
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 * macroblock level
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
186 *
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
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
189 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
190 GetBitContext *gb = &h->s.gb;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
191 int block, pred_mode_uv;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
192 uint8_t top[18];
3472
0e0cffe06fb3 avoid double copying of left border in luma prediction
stefang
parents: 3471
diff changeset
193 uint8_t *left = NULL;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
194 uint8_t *d;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
195
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
196 init_mb(h);
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
197
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
198 /* get intra prediction modes from stream */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
199 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
200 int nA,nB,predpred;
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
201 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
202
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
203 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
204 nB = h->pred_mode_Y[pos-3];
3409
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
205 predpred = FFMIN(nA,nB);
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
206 if(predpred == NOT_AVAIL) // if either is not available
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
207 predpred = INTRA_L_LP;
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
208 if(!get_bits1(gb)){
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
209 int rem_mode= get_bits(gb, 2);
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
210 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
211 }
3409
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
212 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
213 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
214 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
215 if(pred_mode_uv > 6) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
216 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
217 return -1;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
218 }
5239
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
219 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
220
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
221 /* get coded block pattern */
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
222 if(h->pic_type == FF_I_TYPE)
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
223 cbp_code = get_ue_golomb(gb);
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
224 if(cbp_code > 63){
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
225 av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n");
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
226 return -1;
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
227 }
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
228 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
229 if(h->cbp && !h->qp_fixed)
3466
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
230 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
231
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
232 /* 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
233 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
234 d = h->cy + h->luma_scan[block];
3472
0e0cffe06fb3 avoid double copying of left border in luma prediction
stefang
parents: 3471
diff changeset
235 load_intra_pred_luma(h, top, &left, block);
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
236 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
237 (d, top, left, h->l_stride);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
238 if(h->cbp & (1<<block))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
239 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
240 }
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 /* chroma intra prediction */
5238
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
243 load_intra_pred_chroma(h);
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
244 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
245 h->left_border_u, h->c_stride);
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
246 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
247 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
248
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
249 decode_residual_chroma(h);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
250 ff_cavs_filter(h,I_8X8);
5241
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
251 set_mv_intra(h);
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
252 return 0;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
253 }
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 static void decode_mb_p(AVSContext *h, enum mb_t mb_type) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
256 GetBitContext *gb = &h->s.gb;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
257 int ref[4];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
258
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
259 init_mb(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
260 switch(mb_type) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
261 case P_SKIP:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
262 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
263 break;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
264 case P_16X16:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
265 ref[0] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
266 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
267 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
268 case P_16X8:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
269 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
270 ref[2] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
271 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
272 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
273 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
274 case P_8X16:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
275 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
276 ref[1] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
277 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
278 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
279 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
280 case P_8X8:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
281 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
282 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
283 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
284 ref[3] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
285 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
286 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
287 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
288 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
289 }
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
290 ff_cavs_inter(h, mb_type);
5240
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
291 set_intra_mode_default(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
292 store_mvs(h);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
293 if(mb_type != P_SKIP)
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
294 decode_residual_inter(h);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
295 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
296 *h->col_type = mb_type;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
297 }
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 static void decode_mb_b(AVSContext *h, enum mb_t mb_type) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
300 int block;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
301 enum sub_mb_t sub_type[4];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
302 int flags;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
303
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
304 init_mb(h);
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
305
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
306 /* reset all MVs */
5235
5e6c54a13769 make vector constants global
stefang
parents: 5215
diff changeset
307 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
308 set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
5235
5e6c54a13769 make vector constants global
stefang
parents: 5215
diff changeset
309 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
310 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
311 switch(mb_type) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
312 case B_SKIP:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
313 case B_DIRECT:
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
314 if(!(*h->col_type)) {
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
315 /* intra MB at co-location, do in-plane prediction */
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
316 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
317 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
318 } else
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
319 /* direct prediction from co-located P MB, block-wise */
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
320 for(block=0;block<4;block++)
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
321 mv_pred_direct(h,&h->mv[mv_scan[block]],
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
322 &h->col_mv[(h->mby*h->mb_width+h->mbx)*4 + block]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
323 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
324 case B_FWD_16X16:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
325 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
326 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
327 case B_SYM_16X16:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
328 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
329 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
330 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
331 case B_BWD_16X16:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
332 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
333 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
334 case B_8X8:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
335 for(block=0;block<4;block++)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
336 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
337 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
338 switch(sub_type[block]) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
339 case B_SUB_DIRECT:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
340 if(!(*h->col_type)) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
341 /* intra MB at co-location, do in-plane prediction */
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
342 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
343 MV_PRED_BSKIP, BLK_8X8, 1);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
344 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
345 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
346 MV_PRED_BSKIP, BLK_8X8, 0);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
347 } else
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
348 mv_pred_direct(h,&h->mv[mv_scan[block]],
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
349 &h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + block]);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
350 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
351 case B_SUB_FWD:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
352 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
353 MV_PRED_MEDIAN, BLK_8X8, 1);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
354 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
355 case B_SUB_SYM:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
356 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
357 MV_PRED_MEDIAN, BLK_8X8, 1);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
358 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
359 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
360 }
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 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
363 if(sub_type[block] == B_SUB_BWD)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
364 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
365 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
366 MV_PRED_MEDIAN, BLK_8X8, 0);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
367 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
368 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
369 default:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
370 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
371 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
372 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
373 if(flags & FWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
374 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
375 if(flags & SYM0)
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
376 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
377 if(flags & FWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
378 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, 1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
379 if(flags & SYM1)
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
380 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
381 if(flags & BWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
382 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
383 if(flags & BWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
384 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
385 } else { /* 8x16 macroblock types */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
386 if(flags & FWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
387 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, 1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
388 if(flags & SYM0)
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
389 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
390 if(flags & FWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
391 ff_cavs_mv(h,MV_FWD_X1,MV_FWD_C2,MV_PRED_TOPRIGHT,BLK_8X16,1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
392 if(flags & SYM1)
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
393 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
394 if(flags & BWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
395 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
396 if(flags & BWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
397 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
398 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
399 }
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
400 ff_cavs_inter(h, mb_type);
5240
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
401 set_intra_mode_default(h);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
402 if(mb_type != B_SKIP)
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
403 decode_residual_inter(h);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
404 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
405 }
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 * slice level
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
410 *
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 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
414 if(h->stc > 0xAF)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
415 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
416 h->mby = h->stc;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
417 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
418 h->qp_fixed = get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
419 h->qp = get_bits(gb,6);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
420 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
421 /* 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
422 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
423 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
424 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
425 "weighted prediction not yet supported\n");
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
426 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
427 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
428 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
429
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
430 static inline void check_for_slice(AVSContext *h) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
431 GetBitContext *gb = &h->s.gb;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
432 int align;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
433 align = (-get_bits_count(gb)) & 7;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
434 if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
435 get_bits_long(gb,24+align);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
436 h->stc = get_bits(gb,8);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
437 decode_slice_header(h,gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
438 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
439 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
440
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
441 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
442 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
443 * frame level
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
444 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
445 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
446
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
447 static int decode_pic(AVSContext *h) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
448 MpegEncContext *s = &h->s;
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
449 int skip_count;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
450 enum mb_t mb_type;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
451
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
452 if (!s->context_initialized) {
3524
419409926166 some MMX optimizations for the CAVS decoder
stefang
parents: 3472
diff changeset
453 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
454 if (MPV_common_init(s) < 0)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
455 return -1;
3524
419409926166 some MMX optimizations for the CAVS decoder
stefang
parents: 3472
diff changeset
456 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
457 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
458 get_bits(&s->gb,16);//bbv_dwlay
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
459 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
460 h->pic_type = get_bits(&s->gb,2) + FF_I_TYPE;
3466
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
461 if(h->pic_type > FF_B_TYPE) {
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
462 av_log(s->avctx, AV_LOG_ERROR, "illegal picture type\n");
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
463 return -1;
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
464 }
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
465 /* 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
466 if(!h->DPB[0].data[0] ||
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
467 (!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
468 return -1;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
469 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
470 h->pic_type = FF_I_TYPE;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
471 if(get_bits1(&s->gb))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
472 get_bits(&s->gb,16);//time_code
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
473 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
474 /* release last B frame */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
475 if(h->picture.data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
476 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
477
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
478 s->avctx->get_buffer(s->avctx, (AVFrame *)&h->picture);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
479 ff_cavs_init_pic(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
480 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
481
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
482 /* 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
483 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
484 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
485 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
486 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
487 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
488 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
489 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
490 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
491 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
492 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
493 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
494 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
495 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
496 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
497
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
498 if(s->low_delay)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
499 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
500 h->progressive = get_bits1(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
501 if(h->progressive)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
502 h->pic_structure = 1;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
503 else if(!(h->pic_structure = get_bits1(&s->gb) && (h->stc == PIC_PB_START_CODE)) )
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
504 get_bits1(&s->gb); //advanced_pred_mode_disable
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
505 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
506 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
507 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
508 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
509 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
510 if(!h->progressive && !h->pic_structure)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
511 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
512 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
513 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
514 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
515 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
516 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
517 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
518 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
519 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
520 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
521 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
522 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
523 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
524 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
525 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
526 check_for_slice(h);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
527 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
528 do {
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
529 decode_mb_i(h, 0);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
530 } while(next_mb(h));
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
531 } 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
532 do {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
533 if(h->skip_mode_flag) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
534 skip_count = get_ue_golomb(&s->gb);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
535 while(skip_count--) {
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
536 decode_mb_p(h,P_SKIP);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
537 if(!next_mb(h))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
538 goto done;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
539 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
540 mb_type = get_ue_golomb(&s->gb) + P_16X16;
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
541 } else
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
542 mb_type = get_ue_golomb(&s->gb) + P_SKIP;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
543 if(mb_type > P_8X8) {
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
544 decode_mb_i(h, mb_type - P_8X8 - 1);
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
545 } else
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
546 decode_mb_p(h,mb_type);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
547 } while(next_mb(h));
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
548 } else { /* FF_B_TYPE */
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
549 do {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
550 if(h->skip_mode_flag) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
551 skip_count = get_ue_golomb(&s->gb);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
552 while(skip_count--) {
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
553 decode_mb_b(h,B_SKIP);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
554 if(!next_mb(h))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
555 goto done;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
556 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
557 mb_type = get_ue_golomb(&s->gb) + B_DIRECT;
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
558 } else
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
559 mb_type = get_ue_golomb(&s->gb) + B_SKIP;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
560 if(mb_type > B_8X8) {
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
561 decode_mb_i(h, mb_type - B_8X8 - 1);
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
562 } else
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
563 decode_mb_b(h,mb_type);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
564 } while(next_mb(h));
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
565 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
566 done:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
567 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
568 if(h->DPB[1].data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
569 s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
570 memcpy(&h->DPB[1], &h->DPB[0], sizeof(Picture));
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
571 memcpy(&h->DPB[0], &h->picture, sizeof(Picture));
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
572 memset(&h->picture,0,sizeof(Picture));
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
573 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
574 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
575 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
576
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
577 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
578 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
579 * headers and interface
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
580 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
581 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
582
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
583 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
584 MpegEncContext *s = &h->s;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
585 int frame_rate_code;
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 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
588 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
589 skip_bits1(&s->gb); //progressive sequence
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
590 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
591 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
592 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
593 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
594 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
595 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
596 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
597 skip_bits1(&s->gb); //marker_bit
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
598 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
599 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
600 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
601 h->mb_height = (s->height + 15) >> 4;
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
602 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
603 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
604 h->s.avctx->width = s->width;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
605 h->s.avctx->height = s->height;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
606 if(!h->top_qp)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
607 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
608 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
609 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
610
4178
f623a9939995 rename ff_cavs_flush to cavs_flush and make it static
stefang
parents: 4177
diff changeset
611 static void cavs_flush(AVCodecContext * avctx) {
3382
b956afdc00d9 remove unneeded casts
mru
parents: 3381
diff changeset
612 AVSContext *h = avctx->priv_data;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
613 h->got_keyframe = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
614 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
615
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
616 static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
617 uint8_t * buf, int buf_size) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
618 AVSContext *h = avctx->priv_data;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
619 MpegEncContext *s = &h->s;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
620 int input_size;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
621 const uint8_t *buf_end;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
622 const uint8_t *buf_ptr;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
623 AVFrame *picture = data;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
624 uint32_t stc;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
625
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
626 s->avctx = avctx;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
627
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
628 if (buf_size == 0) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
629 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
630 *data_size = sizeof(AVPicture);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
631 *picture = *(AVFrame *) &h->DPB[0];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
632 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
633 return 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 buf_ptr = buf;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
637 buf_end = buf + buf_size;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
638 for(;;) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
639 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
640 if(stc & 0xFFFFFE00)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
641 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
642 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
643 switch(stc) {
4917
6c457e692336 avoid a clash between two definitions of SEQ_START_CODE
aurel
parents: 4594
diff changeset
644 case CAVS_START_CODE:
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
645 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
646 decode_seq_header(h);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
647 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
648 case PIC_I_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
649 if(!h->got_keyframe) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
650 if(h->DPB[0].data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
651 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
652 if(h->DPB[1].data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
653 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
654 h->got_keyframe = 1;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
655 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
656 case PIC_PB_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
657 *data_size = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
658 if(!h->got_keyframe)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
659 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
660 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
661 h->stc = stc;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
662 if(decode_pic(h))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
663 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
664 *data_size = sizeof(AVPicture);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
665 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
666 if(h->DPB[1].data[0]) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
667 *picture = *(AVFrame *) &h->DPB[1];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
668 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
669 *data_size = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
670 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
671 } else
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
672 *picture = *(AVFrame *) &h->picture;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
673 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
674 case EXT_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
675 //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
676 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
677 case USER_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
678 //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
679 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
680 default:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
681 if (stc >= SLICE_MIN_START_CODE &&
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
682 stc <= SLICE_MAX_START_CODE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
683 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
684 decode_slice_header(h, &s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
685 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
686 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
687 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
688 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
689 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
690
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
691 AVCodec cavs_decoder = {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
692 "cavs",
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
693 CODEC_TYPE_VIDEO,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
694 CODEC_ID_CAVS,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
695 sizeof(AVSContext),
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
696 ff_cavs_init,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
697 NULL,
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
698 ff_cavs_end,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
699 cavs_decode_frame,
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
700 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
4178
f623a9939995 rename ff_cavs_flush to cavs_flush and make it static
stefang
parents: 4177
diff changeset
701 .flush= cavs_flush,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
702 };