annotate cavsdec.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 1241c824de46
children
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
3402
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"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
29 #include "get_bits.h"
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
30 #include "golomb.h"
4944
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) {
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
56 h->col_mv[h->mbidx*4 + 0] = h->mv[MV_FWD_X0];
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
57 h->col_mv[h->mbidx*4 + 1] = h->mv[MV_FWD_X1];
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
58 h->col_mv[h->mbidx*4 + 2] = h->mv[MV_FWD_X2];
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
59 h->col_mv[h->mbidx*4 + 3] = h->mv[MV_FWD_X3];
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
60 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
61
8605
33f51dd2491f rename vector_t to cavs_vector
stefang
parents: 8331
diff changeset
62 static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
33f51dd2491f rename vector_t to cavs_vector
stefang
parents: 8331
diff changeset
63 cavs_vector *col_mv) {
33f51dd2491f rename vector_t to cavs_vector
stefang
parents: 8331
diff changeset
64 cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
65 int den = h->direct_den[col_mv->ref];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
66 int m = col_mv->x >> 31;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
67
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
68 pmv_fw->dist = h->dist[1];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
69 pmv_bw->dist = h->dist[0];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
70 pmv_fw->ref = 1;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
71 pmv_bw->ref = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
72 /* scale the co-located motion vector according to its temporal span */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
73 pmv_fw->x = (((den+(den*col_mv->x*pmv_fw->dist^m)-m-1)>>14)^m)-m;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
74 pmv_bw->x = m-(((den+(den*col_mv->x*pmv_bw->dist^m)-m-1)>>14)^m);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
75 m = col_mv->y >> 31;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
76 pmv_fw->y = (((den+(den*col_mv->y*pmv_fw->dist^m)-m-1)>>14)^m)-m;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
77 pmv_bw->y = m-(((den+(den*col_mv->y*pmv_bw->dist^m)-m-1)>>14)^m);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
78 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
79
8606
c3a96cea3453 rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents: 8605
diff changeset
80 static inline void mv_pred_sym(AVSContext *h, cavs_vector *src, enum cavs_block size) {
8605
33f51dd2491f rename vector_t to cavs_vector
stefang
parents: 8331
diff changeset
81 cavs_vector *dst = src + MV_BWD_OFFS;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
82
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
83 /* backward mv is the scaled and negated forward mv */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
84 dst->x = -((src->x * h->sym_factor + 256) >> 9);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
85 dst->y = -((src->y * h->sym_factor + 256) >> 9);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
86 dst->ref = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
87 dst->dist = h->dist[0];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
88 set_mvs(dst, size);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
89 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
90
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
91 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
92 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
93 * residual data decoding
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
94 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
95 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
96
3402
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,
8331
0579157cbb14 Avoid POSIX-reserved _t in identifier names.
diego
parents: 7040
diff changeset
116 const struct dec_2dvlc *r, int esc_golomb_order,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
117 int qp, uint8_t *dst, int stride) {
5243
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
118 int i, level_code, esc_code, level, run, mask;
6913
e716466d3665 Arrays where one element too small, fixes CID114.
michael
parents: 6710
diff changeset
119 DCTELEM level_buf[65];
e716466d3665 Arrays where one element too small, fixes CID114.
michael
parents: 6710
diff changeset
120 uint8_t run_buf[65];
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;
12356
1241c824de46 Move cavs dsp functions to their own struct
mru
parents: 11644
diff changeset
146 h->cdsp.cavs_idct8_add(dst,block,stride);
8793
d46cde168c69 avoid duplicating dsputil's clear_block
stefang
parents: 8792
diff changeset
147 h->s.dsp.clear_block(block);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
148 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
149 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
150
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
151
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
152 static inline void decode_residual_chroma(AVSContext *h) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
153 if(h->cbp & (1<<4))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
154 decode_residual_block(h,&h->s.gb,ff_cavs_chroma_dec,0,
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
155 ff_cavs_chroma_qp[h->qp],h->cu,h->c_stride);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
156 if(h->cbp & (1<<5))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
157 decode_residual_block(h,&h->s.gb,ff_cavs_chroma_dec,0,
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
158 ff_cavs_chroma_qp[h->qp],h->cv,h->c_stride);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
159 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
160
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
161 static inline int decode_residual_inter(AVSContext *h) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
162 int block;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
163
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
164 /* get coded block pattern */
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
165 int cbp= get_ue_golomb(&h->s.gb);
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
166 if(cbp > 63){
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
167 av_log(h->s.avctx, AV_LOG_ERROR, "illegal inter cbp\n");
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
168 return -1;
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
169 }
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
170 h->cbp = cbp_tab[cbp][1];
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
171
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
172 /* get quantizer */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
173 if(h->cbp && !h->qp_fixed)
3466
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
174 h->qp = (h->qp + get_se_golomb(&h->s.gb)) & 63;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
175 for(block=0;block<4;block++)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
176 if(h->cbp & (1<<block))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
177 decode_residual_block(h,&h->s.gb,ff_cavs_inter_dec,0,h->qp,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
178 h->cy + h->luma_scan[block], h->l_stride);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
179 decode_residual_chroma(h);
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
180
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
181 return 0;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
182 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
183
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
184 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
185 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
186 * macroblock level
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
187 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
188 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
189
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
190 static int decode_mb_i(AVSContext *h, int cbp_code) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
191 GetBitContext *gb = &h->s.gb;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
192 int block, pred_mode_uv;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
193 uint8_t top[18];
3472
0e0cffe06fb3 avoid double copying of left border in luma prediction
stefang
parents: 3471
diff changeset
194 uint8_t *left = NULL;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
195 uint8_t *d;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
196
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
197 ff_cavs_init_mb(h);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
198
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
199 /* get intra prediction modes from stream */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
200 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
201 int nA,nB,predpred;
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
202 int pos = ff_cavs_scan3x3[block];
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
203
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
204 nA = h->pred_mode_Y[pos-1];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
205 nB = h->pred_mode_Y[pos-3];
3409
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
206 predpred = FFMIN(nA,nB);
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
207 if(predpred == NOT_AVAIL) // if either is not available
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
208 predpred = INTRA_L_LP;
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
209 if(!get_bits1(gb)){
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
210 int rem_mode= get_bits(gb, 2);
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
211 predpred = rem_mode + (rem_mode >= predpred);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
212 }
3409
584ff6431043 simplify intra prediction mode decoding
michael
parents: 3408
diff changeset
213 h->pred_mode_Y[pos] = predpred;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
214 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
215 pred_mode_uv = get_ue_golomb(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
216 if(pred_mode_uv > 6) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
217 av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra chroma pred mode\n");
3410
3b72265410f3 return -1 on bitstream errors instead of continuing, as the following stuff almost always will be useless until the next startcode
michael
parents: 3409
diff changeset
218 return -1;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
219 }
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
220 ff_cavs_modify_mb_i(h, &pred_mode_uv);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
221
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
222 /* get coded block pattern */
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
223 if(h->pic_type == FF_I_TYPE)
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
224 cbp_code = get_ue_golomb(gb);
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
225 if(cbp_code > 63){
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
226 av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n");
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
227 return -1;
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
228 }
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
229 h->cbp = cbp_tab[cbp_code][0];
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
230 if(h->cbp && !h->qp_fixed)
3466
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
231 h->qp = (h->qp + get_se_golomb(gb)) & 63; //qp_delta
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
232
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
233 /* luma intra prediction interleaved with residual decode/transform/add */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
234 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
235 d = h->cy + h->luma_scan[block];
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
236 ff_cavs_load_intra_pred_luma(h, top, &left, block);
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
237 h->intra_pred_l[h->pred_mode_Y[ff_cavs_scan3x3[block]]]
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
238 (d, top, left, h->l_stride);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
239 if(h->cbp & (1<<block))
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
240 decode_residual_block(h,gb,ff_cavs_intra_dec,1,h->qp,d,h->l_stride);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
241 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
242
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
243 /* chroma intra prediction */
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
244 ff_cavs_load_intra_pred_chroma(h);
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
245 h->intra_pred_c[pred_mode_uv](h->cu, &h->top_border_u[h->mbx*10],
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
246 h->left_border_u, h->c_stride);
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
247 h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx*10],
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
248 h->left_border_v, h->c_stride);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
249
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
250 decode_residual_chroma(h);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
251 ff_cavs_filter(h,I_8X8);
5241
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
252 set_mv_intra(h);
3408
73c648ae1c74 check cbp for validity, avoids possible out of array reads / segfaults
michael
parents: 3407
diff changeset
253 return 0;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
254 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
255
8606
c3a96cea3453 rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents: 8605
diff changeset
256 static void decode_mb_p(AVSContext *h, enum cavs_mb mb_type) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
257 GetBitContext *gb = &h->s.gb;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
258 int ref[4];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
259
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
260 ff_cavs_init_mb(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
261 switch(mb_type) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
262 case P_SKIP:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
263 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_PSKIP, BLK_16X16, 0);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
264 break;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
265 case P_16X16:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
266 ref[0] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
267 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16,ref[0]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
268 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
269 case P_16X8:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
270 ref[0] = h->ref_flag ? 0 : get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
271 ref[2] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
272 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, ref[0]);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
273 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, ref[2]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
274 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
275 case P_8X16:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
276 ref[0] = h->ref_flag ? 0 : get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
277 ref[1] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
278 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, ref[0]);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
279 ff_cavs_mv(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_TOPRIGHT,BLK_8X16, ref[1]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
280 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
281 case P_8X8:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
282 ref[0] = h->ref_flag ? 0 : get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
283 ref[1] = h->ref_flag ? 0 : get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
284 ref[2] = h->ref_flag ? 0 : get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
285 ref[3] = h->ref_flag ? 0 : get_bits1(gb);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
286 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_MEDIAN, BLK_8X8, ref[0]);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
287 ff_cavs_mv(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_MEDIAN, BLK_8X8, ref[1]);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
288 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_X1, MV_PRED_MEDIAN, BLK_8X8, ref[2]);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
289 ff_cavs_mv(h, MV_FWD_X3, MV_FWD_X0, MV_PRED_MEDIAN, BLK_8X8, ref[3]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
290 }
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
291 ff_cavs_inter(h, mb_type);
5240
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
292 set_intra_mode_default(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
293 store_mvs(h);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
294 if(mb_type != P_SKIP)
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
295 decode_residual_inter(h);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
296 ff_cavs_filter(h,mb_type);
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
297 h->col_type_base[h->mbidx] = mb_type;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
298 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
299
8606
c3a96cea3453 rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents: 8605
diff changeset
300 static void decode_mb_b(AVSContext *h, enum cavs_mb mb_type) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
301 int block;
8606
c3a96cea3453 rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents: 8605
diff changeset
302 enum cavs_sub_mb sub_type[4];
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
303 int flags;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
304
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
305 ff_cavs_init_mb(h);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
306
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
307 /* reset all MVs */
5235
5e6c54a13769 make vector constants global
stefang
parents: 5215
diff changeset
308 h->mv[MV_FWD_X0] = ff_cavs_dir_mv;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
309 set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
5235
5e6c54a13769 make vector constants global
stefang
parents: 5215
diff changeset
310 h->mv[MV_BWD_X0] = ff_cavs_dir_mv;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
311 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
312 switch(mb_type) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
313 case B_SKIP:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
314 case B_DIRECT:
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
315 if(!h->col_type_base[h->mbidx]) {
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
316 /* intra MB at co-location, do in-plane prediction */
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
317 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_BSKIP, BLK_16X16, 1);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
318 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_BSKIP, BLK_16X16, 0);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
319 } else
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
320 /* direct prediction from co-located P MB, block-wise */
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
321 for(block=0;block<4;block++)
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
322 mv_pred_direct(h,&h->mv[mv_scan[block]],
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
323 &h->col_mv[h->mbidx*4 + block]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
324 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
325 case B_FWD_16X16:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
326 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
327 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
328 case B_SYM_16X16:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
329 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
330 mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X16);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
331 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
332 case B_BWD_16X16:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
333 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_MEDIAN, BLK_16X16, 0);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
334 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
335 case B_8X8:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
336 for(block=0;block<4;block++)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
337 sub_type[block] = get_bits(&h->s.gb,2);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
338 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
339 switch(sub_type[block]) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
340 case B_SUB_DIRECT:
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
341 if(!h->col_type_base[h->mbidx]) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
342 /* intra MB at co-location, do in-plane prediction */
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
343 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
344 MV_PRED_BSKIP, BLK_8X8, 1);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
345 ff_cavs_mv(h, mv_scan[block]+MV_BWD_OFFS,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
346 mv_scan[block]-3+MV_BWD_OFFS,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
347 MV_PRED_BSKIP, BLK_8X8, 0);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
348 } else
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
349 mv_pred_direct(h,&h->mv[mv_scan[block]],
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
350 &h->col_mv[h->mbidx*4 + block]);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
351 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
352 case B_SUB_FWD:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
353 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
354 MV_PRED_MEDIAN, BLK_8X8, 1);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
355 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
356 case B_SUB_SYM:
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
357 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
358 MV_PRED_MEDIAN, BLK_8X8, 1);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
359 mv_pred_sym(h, &h->mv[mv_scan[block]], BLK_8X8);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
360 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
361 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
362 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
363 for(block=0;block<4;block++) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
364 if(sub_type[block] == B_SUB_BWD)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
365 ff_cavs_mv(h, mv_scan[block]+MV_BWD_OFFS,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
366 mv_scan[block]+MV_BWD_OFFS-3,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
367 MV_PRED_MEDIAN, BLK_8X8, 0);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
368 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
369 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
370 default:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
371 assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8));
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
372 flags = ff_cavs_partition_flags[mb_type];
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
373 if(mb_type & 1) { /* 16x8 macroblock types */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
374 if(flags & FWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
375 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
376 if(flags & SYM0)
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
377 mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X8);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
378 if(flags & FWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
379 ff_cavs_mv(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, 1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
380 if(flags & SYM1)
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
381 mv_pred_sym(h, &h->mv[MV_FWD_X2], BLK_16X8);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
382 if(flags & BWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
383 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_TOP, BLK_16X8, 0);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
384 if(flags & BWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
385 ff_cavs_mv(h, MV_BWD_X2, MV_BWD_A1, MV_PRED_LEFT, BLK_16X8, 0);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
386 } else { /* 8x16 macroblock types */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
387 if(flags & FWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
388 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, 1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
389 if(flags & SYM0)
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
390 mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_8X16);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
391 if(flags & FWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
392 ff_cavs_mv(h,MV_FWD_X1,MV_FWD_C2,MV_PRED_TOPRIGHT,BLK_8X16,1);
3469
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
393 if(flags & SYM1)
c9059c843d4c change partition flags SYM -> FWD|SYM
stefang
parents: 3468
diff changeset
394 mv_pred_sym(h, &h->mv[MV_FWD_X1], BLK_8X16);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
395 if(flags & BWD0)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
396 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_B3, MV_PRED_LEFT, BLK_8X16, 0);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
397 if(flags & BWD1)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
398 ff_cavs_mv(h,MV_BWD_X1,MV_BWD_C2,MV_PRED_TOPRIGHT,BLK_8X16,0);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
399 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
400 }
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
401 ff_cavs_inter(h, mb_type);
5240
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
402 set_intra_mode_default(h);
3403
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
403 if(mb_type != B_SKIP)
fc0eb7836ccb cleanup macroblock layer: merged decode of skipped MBs
stefang
parents: 3402
diff changeset
404 decode_residual_inter(h);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
405 ff_cavs_filter(h,mb_type);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
406 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
407
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
408 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
409 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
410 * slice level
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
411 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
412 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
413
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
414 static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
415 if(h->stc > 0xAF)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
416 av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
417 h->mby = h->stc;
8796
c6dd98bff427 introduce a macroblock index to avoid a few x*width+y calculations
stefang
parents: 8795
diff changeset
418 h->mbidx = h->mby*h->mb_width;
8795
e18df4791658 fix multiple slices per frame
stefang
parents: 8794
diff changeset
419
e18df4791658 fix multiple slices per frame
stefang
parents: 8794
diff changeset
420 /* mark top macroblocks as unavailable */
e18df4791658 fix multiple slices per frame
stefang
parents: 8794
diff changeset
421 h->flags &= ~(B_AVAIL|C_AVAIL);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
422 if((h->mby == 0) && (!h->qp_fixed)){
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
423 h->qp_fixed = get_bits1(gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
424 h->qp = get_bits(gb,6);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
425 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
426 /* inter frame or second slice can have weighting params */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
427 if((h->pic_type != FF_I_TYPE) || (!h->pic_structure && h->mby >= h->mb_width/2))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
428 if(get_bits1(gb)) { //slice_weighting_flag
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
429 av_log(h->s.avctx, AV_LOG_ERROR,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
430 "weighted prediction not yet supported\n");
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
431 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
432 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
433 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
434
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
435 static inline int check_for_slice(AVSContext *h) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
436 GetBitContext *gb = &h->s.gb;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
437 int align;
8795
e18df4791658 fix multiple slices per frame
stefang
parents: 8794
diff changeset
438
e18df4791658 fix multiple slices per frame
stefang
parents: 8794
diff changeset
439 if(h->mbx)
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
440 return 0;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
441 align = (-get_bits_count(gb)) & 7;
9023
c753d074bbed check for a stuffing byte at the end of a slice
stefang
parents: 9022
diff changeset
442 /* check for stuffing byte */
c753d074bbed check for a stuffing byte at the end of a slice
stefang
parents: 9022
diff changeset
443 if(!align && (show_bits(gb,8) == 0x80))
9897
d69eaf40d1b8 fix slice header checking
stefang
parents: 9428
diff changeset
444 align = 8;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
445 if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5401
diff changeset
446 skip_bits_long(gb,24+align);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
447 h->stc = get_bits(gb,8);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
448 decode_slice_header(h,gb);
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
449 return 1;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
450 }
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
451 return 0;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
452 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
453
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
454 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
455 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
456 * frame level
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
457 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
458 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
459
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
460 static int decode_pic(AVSContext *h) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
461 MpegEncContext *s = &h->s;
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
462 int skip_count = -1;
8606
c3a96cea3453 rename XXX_t enums to cavs_XXX to fix POSIX namespace issue
stefang
parents: 8605
diff changeset
463 enum cavs_mb mb_type;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
464
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
465 if (!s->context_initialized) {
3524
419409926166 some MMX optimizations for the CAVS decoder
stefang
parents: 3472
diff changeset
466 s->avctx->idct_algo = FF_IDCT_CAVS;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
467 if (MPV_common_init(s) < 0)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
468 return -1;
3524
419409926166 some MMX optimizations for the CAVS decoder
stefang
parents: 3472
diff changeset
469 ff_init_scantable(s->dsp.idct_permutation,&h->scantable,ff_zigzag_direct);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
470 }
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5401
diff changeset
471 skip_bits(&s->gb,16);//bbv_dwlay
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
472 if(h->stc == PIC_PB_START_CODE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
473 h->pic_type = get_bits(&s->gb,2) + FF_I_TYPE;
3466
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
474 if(h->pic_type > FF_B_TYPE) {
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
475 av_log(s->avctx, AV_LOG_ERROR, "illegal picture type\n");
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
476 return -1;
af598a3e2340 avoid overflows of qp and pic_type
stefang
parents: 3460
diff changeset
477 }
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
478 /* make sure we have the reference frames we need */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
479 if(!h->DPB[0].data[0] ||
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
480 (!h->DPB[1].data[0] && h->pic_type == FF_B_TYPE))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
481 return -1;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
482 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
483 h->pic_type = FF_I_TYPE;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
484 if(get_bits1(&s->gb))
8792
b149d445bf4c time_code has 24 bits, not 16
stefang
parents: 8791
diff changeset
485 skip_bits(&s->gb,24);//time_code
11179
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
486 /* old sample clips were all progressive and no low_delay,
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
487 bump stream revision if detected otherwise */
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
488 if((s->low_delay) || !(show_bits(&s->gb,9) & 1))
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
489 h->stream_revision = 1;
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
490 /* similarly test top_field_first and repeat_first_field */
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
491 else if(show_bits(&s->gb,11) & 3)
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
492 h->stream_revision = 1;
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
493 if(h->stream_revision > 0)
9a793cb05a85 add heuristic to discern the old sample clips from streams encoded
stefang
parents: 9897
diff changeset
494 skip_bits(&s->gb,1); //marker_bit
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
495 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
496 /* release last B frame */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
497 if(h->picture.data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
498 s->avctx->release_buffer(s->avctx, (AVFrame *)&h->picture);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
499
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
500 s->avctx->get_buffer(s->avctx, (AVFrame *)&h->picture);
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
501 ff_cavs_init_pic(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
502 h->picture.poc = get_bits(&s->gb,8)*2;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
503
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
504 /* get temporal distances and MV scaling factors */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
505 if(h->pic_type != FF_B_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
506 h->dist[0] = (h->picture.poc - h->DPB[0].poc + 512) % 512;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
507 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
508 h->dist[0] = (h->DPB[0].poc - h->picture.poc + 512) % 512;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
509 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
510 h->dist[1] = (h->picture.poc - h->DPB[1].poc + 512) % 512;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
511 h->scale_den[0] = h->dist[0] ? 512/h->dist[0] : 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
512 h->scale_den[1] = h->dist[1] ? 512/h->dist[1] : 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
513 if(h->pic_type == FF_B_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
514 h->sym_factor = h->dist[0]*h->scale_den[1];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
515 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
516 h->direct_den[0] = h->dist[0] ? 16384/h->dist[0] : 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
517 h->direct_den[1] = h->dist[1] ? 16384/h->dist[1] : 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
518 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
519
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
520 if(s->low_delay)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
521 get_ue_golomb(&s->gb); //bbv_check_times
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
522 h->progressive = get_bits1(&s->gb);
8794
1f98fc269920 fix parsing of pic_structure
stefang
parents: 8793
diff changeset
523 h->pic_structure = 1;
1f98fc269920 fix parsing of pic_structure
stefang
parents: 8793
diff changeset
524 if(!h->progressive)
1f98fc269920 fix parsing of pic_structure
stefang
parents: 8793
diff changeset
525 h->pic_structure = get_bits1(&s->gb);
1f98fc269920 fix parsing of pic_structure
stefang
parents: 8793
diff changeset
526 if(!h->pic_structure && h->stc == PIC_PB_START_CODE)
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5401
diff changeset
527 skip_bits1(&s->gb); //advanced_pred_mode_disable
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
528 skip_bits1(&s->gb); //top_field_first
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
529 skip_bits1(&s->gb); //repeat_first_field
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
530 h->qp_fixed = get_bits1(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
531 h->qp = get_bits(&s->gb,6);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
532 if(h->pic_type == FF_I_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
533 if(!h->progressive && !h->pic_structure)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
534 skip_bits1(&s->gb);//what is this?
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
535 skip_bits(&s->gb,4); //reserved bits
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
536 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
537 if(!(h->pic_type == FF_B_TYPE && h->pic_structure == 1))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
538 h->ref_flag = get_bits1(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
539 skip_bits(&s->gb,4); //reserved bits
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
540 h->skip_mode_flag = get_bits1(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
541 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
542 h->loop_filter_disable = get_bits1(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
543 if(!h->loop_filter_disable && get_bits1(&s->gb)) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
544 h->alpha_offset = get_se_golomb(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
545 h->beta_offset = get_se_golomb(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
546 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
547 h->alpha_offset = h->beta_offset = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
548 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
549 if(h->pic_type == FF_I_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
550 do {
8795
e18df4791658 fix multiple slices per frame
stefang
parents: 8794
diff changeset
551 check_for_slice(h);
3415
3a728a9cbd54 even more cbp safety
stefang
parents: 3414
diff changeset
552 decode_mb_i(h, 0);
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
553 } while(ff_cavs_next_mb(h));
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
554 } else if(h->pic_type == FF_P_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
555 do {
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
556 if(check_for_slice(h))
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
557 skip_count = -1;
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
558 if(h->skip_mode_flag && (skip_count < 0))
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
559 skip_count = get_ue_golomb(&s->gb);
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
560 if(h->skip_mode_flag && skip_count--) {
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
561 decode_mb_p(h,P_SKIP);
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
562 } else {
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
563 mb_type = get_ue_golomb(&s->gb) + P_SKIP + h->skip_mode_flag;
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
564 if(mb_type > P_8X8)
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
565 decode_mb_i(h, mb_type - P_8X8 - 1);
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
566 else
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
567 decode_mb_p(h,mb_type);
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
568 }
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
569 } while(ff_cavs_next_mb(h));
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
570 } else { /* FF_B_TYPE */
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
571 do {
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
572 if(check_for_slice(h))
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
573 skip_count = -1;
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
574 if(h->skip_mode_flag && (skip_count < 0))
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
575 skip_count = get_ue_golomb(&s->gb);
9022
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
576 if(h->skip_mode_flag && skip_count--) {
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
577 decode_mb_b(h,B_SKIP);
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
578 } else {
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
579 mb_type = get_ue_golomb(&s->gb) + B_SKIP + h->skip_mode_flag;
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
580 if(mb_type > B_8X8)
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
581 decode_mb_i(h, mb_type - B_8X8 - 1);
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
582 else
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
583 decode_mb_b(h,mb_type);
2b92a8c404c9 change macroblock loop in inter frames so that after a
stefang
parents: 8796
diff changeset
584 }
5401
cb5d5d2ee6fd have less functions as inline
stefang
parents: 5250
diff changeset
585 } while(ff_cavs_next_mb(h));
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
586 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
587 if(h->pic_type != FF_B_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
588 if(h->DPB[1].data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
589 s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]);
8608
379d63485cb7 use assignment of structure instead of memcpy
stefang
parents: 8606
diff changeset
590 h->DPB[1] = h->DPB[0];
379d63485cb7 use assignment of structure instead of memcpy
stefang
parents: 8606
diff changeset
591 h->DPB[0] = h->picture;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
592 memset(&h->picture,0,sizeof(Picture));
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
593 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
594 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
595 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
596
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
597 /*****************************************************************************
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
598 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
599 * headers and interface
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
600 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
601 ****************************************************************************/
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
602
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
603 static int decode_seq_header(AVSContext *h) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
604 MpegEncContext *s = &h->s;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
605 int frame_rate_code;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
606
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
607 h->profile = get_bits(&s->gb,8);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
608 h->level = get_bits(&s->gb,8);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
609 skip_bits1(&s->gb); //progressive sequence
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
610 s->width = get_bits(&s->gb,14);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
611 s->height = get_bits(&s->gb,14);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
612 skip_bits(&s->gb,2); //chroma format
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
613 skip_bits(&s->gb,3); //sample_precision
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
614 h->aspect_ratio = get_bits(&s->gb,4);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
615 frame_rate_code = get_bits(&s->gb,4);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
616 skip_bits(&s->gb,18);//bit_rate_lower
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
617 skip_bits1(&s->gb); //marker_bit
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
618 skip_bits(&s->gb,12);//bit_rate_upper
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
619 s->low_delay = get_bits1(&s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
620 h->mb_width = (s->width + 15) >> 4;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
621 h->mb_height = (s->height + 15) >> 4;
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
622 h->s.avctx->time_base.den = ff_frame_rate_tab[frame_rate_code].num;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
623 h->s.avctx->time_base.num = ff_frame_rate_tab[frame_rate_code].den;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
624 h->s.avctx->width = s->width;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
625 h->s.avctx->height = s->height;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
626 if(!h->top_qp)
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
627 ff_cavs_init_top_lines(h);
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
628 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
629 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
630
4178
f623a9939995 rename ff_cavs_flush to cavs_flush and make it static
stefang
parents: 4177
diff changeset
631 static void cavs_flush(AVCodecContext * avctx) {
3382
b956afdc00d9 remove unneeded casts
mru
parents: 3381
diff changeset
632 AVSContext *h = avctx->priv_data;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
633 h->got_keyframe = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
634 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
635
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
636 static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9023
diff changeset
637 AVPacket *avpkt) {
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9023
diff changeset
638 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9023
diff changeset
639 int buf_size = avpkt->size;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
640 AVSContext *h = avctx->priv_data;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
641 MpegEncContext *s = &h->s;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
642 int input_size;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
643 const uint8_t *buf_end;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
644 const uint8_t *buf_ptr;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
645 AVFrame *picture = data;
5574
33718fb21437 Initialize the "stc" variable before using it in ff_find_start_code()
lucabe
parents: 5519
diff changeset
646 uint32_t stc = -1;
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
647
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
648 s->avctx = avctx;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
649
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
650 if (buf_size == 0) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
651 if(!s->low_delay && h->DPB[0].data[0]) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
652 *data_size = sizeof(AVPicture);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
653 *picture = *(AVFrame *) &h->DPB[0];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
654 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
655 return 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
656 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
657
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
658 buf_ptr = buf;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
659 buf_end = buf + buf_size;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
660 for(;;) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
661 buf_ptr = ff_find_start_code(buf_ptr,buf_end, &stc);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
662 if(stc & 0xFFFFFE00)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
663 return FFMAX(0, buf_ptr - buf - s->parse_context.last_index);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
664 input_size = (buf_end - buf_ptr)*8;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
665 switch(stc) {
4917
6c457e692336 avoid a clash between two definitions of SEQ_START_CODE
aurel
parents: 4594
diff changeset
666 case CAVS_START_CODE:
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
667 init_get_bits(&s->gb, buf_ptr, input_size);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
668 decode_seq_header(h);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
669 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
670 case PIC_I_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
671 if(!h->got_keyframe) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
672 if(h->DPB[0].data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
673 avctx->release_buffer(avctx, (AVFrame *)&h->DPB[0]);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
674 if(h->DPB[1].data[0])
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
675 avctx->release_buffer(avctx, (AVFrame *)&h->DPB[1]);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
676 h->got_keyframe = 1;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
677 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
678 case PIC_PB_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
679 *data_size = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
680 if(!h->got_keyframe)
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
681 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
682 init_get_bits(&s->gb, buf_ptr, input_size);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
683 h->stc = stc;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
684 if(decode_pic(h))
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
685 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
686 *data_size = sizeof(AVPicture);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
687 if(h->pic_type != FF_B_TYPE) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
688 if(h->DPB[1].data[0]) {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
689 *picture = *(AVFrame *) &h->DPB[1];
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
690 } else {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
691 *data_size = 0;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
692 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
693 } else
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
694 *picture = *(AVFrame *) &h->picture;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
695 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
696 case EXT_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
697 //mpeg_decode_extension(avctx,buf_ptr, input_size);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
698 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
699 case USER_START_CODE:
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
700 //mpeg_decode_user_data(avctx,buf_ptr, input_size);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
701 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
702 default:
8791
7798afcf0b24 do not check for minimum slice start code, 0x00000100 is valid
stefang
parents: 8718
diff changeset
703 if (stc <= SLICE_MAX_START_CODE) {
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
704 init_get_bits(&s->gb, buf_ptr, input_size);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
705 decode_slice_header(h, &s->gb);
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
706 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
707 break;
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
708 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
709 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
710 }
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
711
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
712 AVCodec cavs_decoder = {
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
713 "cavs",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11179
diff changeset
714 AVMEDIA_TYPE_VIDEO,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
715 CODEC_ID_CAVS,
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
716 sizeof(AVSContext),
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
717 ff_cavs_init,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
718 NULL,
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
719 ff_cavs_end,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
720 cavs_decode_frame,
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3382
diff changeset
721 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
4178
f623a9939995 rename ff_cavs_flush to cavs_flush and make it static
stefang
parents: 4177
diff changeset
722 .flush= cavs_flush,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6913
diff changeset
723 .long_name= NULL_IF_CONFIG_SMALL("Chinese AVS video (AVS1-P2, JiZhun profile)"),
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
724 };