annotate mdec.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents f67b63ed036d
children 0d88e3f89379
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
1 /*
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
2 * PSX MDEC codec
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
4 *
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
9 *
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
13 * Lesser General Public License for more details.
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
14 *
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
18 *
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
19 * based upon code from Sebastian Jedruszkiewicz <elf@frogger.rules.pl>
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
20 */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
21
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
22 /**
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
23 * @file mdec.c
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
24 * PSX MDEC codec.
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
25 * This is very similar to intra only MPEG1.
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
26 */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
27
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
28 #include "avcodec.h"
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
29 #include "dsputil.h"
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
30 #include "mpegvideo.h"
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
31
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
32 //#undef NDEBUG
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
33 //#include <assert.h>
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
34
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
35 typedef struct MDECContext{
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
36 AVCodecContext *avctx;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
37 DSPContext dsp;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
38 AVFrame picture;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
39 PutBitContext pb;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
40 GetBitContext gb;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
41 ScanTable scantable;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
42 int version;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
43 int qscale;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
44 int last_dc[3];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
45 int mb_width;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
46 int mb_height;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
47 int mb_x, mb_y;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
48 DCTELEM __align8 block[6][64];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
49 uint16_t __align8 intra_matrix[64];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
50 int __align8 q_intra_matrix[64];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
51 uint8_t *bitstream_buffer;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
52 int bitstream_buffer_size;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
53 int block_last_index[6];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
54 } MDECContext;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
55
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
56 //very similar to mpeg1
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
57 static inline int mdec_decode_block_intra(MDECContext *a, DCTELEM *block, int n)
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
58 {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
59 int level, diff, i, j, run;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
60 int component;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
61 RLTable *rl = &rl_mpeg1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
62 uint8_t * const scantable= a->scantable.permutated;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
63 const uint16_t *quant_matrix= ff_mpeg1_default_intra_matrix;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
64 const int qscale= a->qscale;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
65
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
66 /* DC coef */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
67 if(a->version==2){
1437
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
68 block[0]= 2*get_sbits(&a->gb, 10) + 1024;
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
69 }else{
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
70 component = (n <= 3 ? 0 : n - 4 + 1);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
71 diff = decode_dc(&a->gb, component);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
72 if (diff >= 0xffff)
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
73 return -1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
74 a->last_dc[component]+= diff;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
75 block[0] = a->last_dc[component]<<3;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
76 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
77
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
78 i = 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
79 {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
80 OPEN_READER(re, &a->gb);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
81 /* now quantify & encode AC coefs */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
82 for(;;) {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
83 UPDATE_CACHE(re, &a->gb);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
84 GET_RL_VLC(level, run, re, &a->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
85
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
86 if(level == 127){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
87 break;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
88 } else if(level != 0) {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
89 i += run;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
90 j = scantable[i];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
91 level= (level*qscale*quant_matrix[j])>>3;
1437
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
92 // level= (level-1)|1;
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
93 level = (level ^ SHOW_SBITS(re, &a->gb, 1)) - SHOW_SBITS(re, &a->gb, 1);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
94 LAST_SKIP_BITS(re, &a->gb, 1);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
95 } else {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
96 /* escape */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
97 run = SHOW_UBITS(re, &a->gb, 6)+1; LAST_SKIP_BITS(re, &a->gb, 6);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
98 UPDATE_CACHE(re, &a->gb);
1436
b57e910e4235 some fixes (still buggy though)
michaelni
parents: 1435
diff changeset
99 level = SHOW_SBITS(re, &a->gb, 10); SKIP_BITS(re, &a->gb, 10);
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
100 i += run;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
101 j = scantable[i];
1437
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
102 if(level<0){
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
103 level= -level;
1437
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
104 level= (level*qscale*quant_matrix[j])>>3;
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
105 level= (level-1)|1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
106 level= -level;
1437
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
107 }else{
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
108 level= (level*qscale*quant_matrix[j])>>3;
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
109 level= (level-1)|1;
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
110 }
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
111 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
112 if (i > 63){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1532
diff changeset
113 av_log(a->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", a->mb_x, a->mb_y);
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
114 return -1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
115 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
116
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
117 block[j] = level;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
118 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
119 CLOSE_READER(re, &a->gb);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
120 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
121 a->block_last_index[n] = i;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
122 return 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
123 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
124
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
125 static inline int decode_mb(MDECContext *a, DCTELEM block[6][64]){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
126 int i;
1438
michaelni
parents: 1437
diff changeset
127 const int block_index[6]= {5,4,0,1,2,3};
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
128
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
129 a->dsp.clear_blocks(block[0]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
130
1437
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
131 for(i=0; i<6; i++){
ba444d478ffe more fixes
michaelni
parents: 1436
diff changeset
132 if( mdec_decode_block_intra(a, block[ block_index[i] ], block_index[i]) < 0)
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
133 return -1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
134 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
135 return 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
136 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
137
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
138 static inline void idct_put(MDECContext *a, int mb_x, int mb_y){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
139 DCTELEM (*block)[64]= a->block;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
140 int linesize= a->picture.linesize[0];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
141
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
142 uint8_t *dest_y = a->picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
143 uint8_t *dest_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
144 uint8_t *dest_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
145
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
146 a->dsp.idct_put(dest_y , linesize, block[0]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
147 a->dsp.idct_put(dest_y + 8, linesize, block[1]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
148 a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
149 a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
150
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
151 if(!(a->avctx->flags&CODEC_FLAG_GRAY)){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
152 a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
153 a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
154 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
155 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
156
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
157 static int decode_frame(AVCodecContext *avctx,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
158 void *data, int *data_size,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
159 uint8_t *buf, int buf_size)
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
160 {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
161 MDECContext * const a = avctx->priv_data;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
162 AVFrame *picture = data;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
163 AVFrame * const p= (AVFrame*)&a->picture;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
164 int i;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
165
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
166 if(p->data[0])
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
167 avctx->release_buffer(avctx, p);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
168
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
169 p->reference= 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
170 if(avctx->get_buffer(avctx, p) < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1532
diff changeset
171 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
172 return -1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
173 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
174 p->pict_type= I_TYPE;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
175 p->key_frame= 1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
176 a->last_dc[0]=
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
177 a->last_dc[1]=
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
178 a->last_dc[2]= 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
179
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
180 a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
1431
e2f288bcfaa4 10l (big vs. little endian)
michaelni
parents: 1419
diff changeset
181 for(i=0; i<buf_size; i+=2){
e2f288bcfaa4 10l (big vs. little endian)
michaelni
parents: 1419
diff changeset
182 a->bitstream_buffer[i] = buf[i+1];
e2f288bcfaa4 10l (big vs. little endian)
michaelni
parents: 1419
diff changeset
183 a->bitstream_buffer[i+1]= buf[i ];
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
184 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
185 init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
186
1435
62c797a19bdf skip preamble bytes
tmmm
parents: 1431
diff changeset
187 /* skip over 4 preamble bytes in stream (typically 0xXX 0xXX 0x00 0x38) */
62c797a19bdf skip preamble bytes
tmmm
parents: 1431
diff changeset
188 skip_bits(&a->gb, 32);
62c797a19bdf skip preamble bytes
tmmm
parents: 1431
diff changeset
189
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
190 a->qscale= get_bits(&a->gb, 16);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
191 a->version= get_bits(&a->gb, 16);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
192
1532
melanson
parents: 1438
diff changeset
193 // printf("qscale:%d (0x%X), version:%d (0x%X)\n", a->qscale, a->qscale, a->version, a->version);
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
194
1436
b57e910e4235 some fixes (still buggy though)
michaelni
parents: 1435
diff changeset
195 for(a->mb_x=0; a->mb_x<a->mb_width; a->mb_x++){
b57e910e4235 some fixes (still buggy though)
michaelni
parents: 1435
diff changeset
196 for(a->mb_y=0; a->mb_y<a->mb_height; a->mb_y++){
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
197 if( decode_mb(a, a->block) <0)
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
198 return -1;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
199
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
200 idct_put(a, a->mb_x, a->mb_y);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
201 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
202 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
203
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
204 // p->quality= (32 + a->inv_qscale/2)/a->inv_qscale;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
205 // memset(p->qscale_table, p->quality, p->qstride*a->mb_height);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
206
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
207 *picture= *(AVFrame*)&a->picture;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
208 *data_size = sizeof(AVPicture);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
209
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
210 emms_c();
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
211
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
212 return (get_bits_count(&a->gb)+31)/32*4;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
213 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
214
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
215 static void mdec_common_init(AVCodecContext *avctx){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
216 MDECContext * const a = avctx->priv_data;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
217
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
218 dsputil_init(&a->dsp, avctx);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
219
2270
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2029
diff changeset
220 a->mb_width = (avctx->coded_width + 15) / 16;
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2029
diff changeset
221 a->mb_height = (avctx->coded_height + 15) / 16;
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
222
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
223 avctx->coded_frame= (AVFrame*)&a->picture;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
224 a->avctx= avctx;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
225 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
226
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
227 static int decode_init(AVCodecContext *avctx){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
228 MDECContext * const a = avctx->priv_data;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
229 AVFrame *p= (AVFrame*)&a->picture;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
230
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
231 mdec_common_init(avctx);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
232 init_vlcs();
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
233 ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_zigzag_direct);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
234 /*
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
235 for(i=0; i<64; i++){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
236 int index= ff_zigzag_direct[i];
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
237 a->intra_matrix[i]= 64*ff_mpeg1_default_intra_matrix[index] / a->inv_qscale;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
238 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
239 */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
240 p->qstride= a->mb_width;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
241 p->qscale_table= av_mallocz( p->qstride * a->mb_height);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
242
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
243 return 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
244 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
245
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
246 static int decode_end(AVCodecContext *avctx){
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
247 MDECContext * const a = avctx->priv_data;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
248
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
249 av_freep(&a->bitstream_buffer);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
250 av_freep(&a->picture.qscale_table);
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
251 a->bitstream_buffer_size=0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
252
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
253 return 0;
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
254 }
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
255
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
256 AVCodec mdec_decoder = {
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
257 "mdec",
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
258 CODEC_TYPE_VIDEO,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
259 CODEC_ID_MDEC,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
260 sizeof(MDECContext),
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
261 decode_init,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
262 NULL,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
263 decode_end,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
264 decode_frame,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
265 CODEC_CAP_DR1,
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
266 };
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents:
diff changeset
267