annotate libmpeg2/decode.c @ 1:3b5f5d1c5041

Initial revision
author arpi_esp
date Sat, 24 Feb 2001 20:28:24 +0000
parents
children 846535ace7a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 /* Copyright (C) Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - Nov 1999 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2 /* Some cleanup & hacking by A'rpi/ESP-team - Oct 2000 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 /* mpeg2dec version: */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5 #define PACKAGE "mpeg2dec"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 //#define VERSION "0.1.7-cvs"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 #define VERSION "0.1.8-cvs"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 #include <unistd.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 #include <fcntl.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 #include <errno.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 #include "config.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 //#include "video_out.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 #include "mpeg2.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20 #include "mpeg2_internal.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22 #include "../linux/shmem.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 //#include "motion_comp.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 //#include "idct.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 //#include "header.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27 //#include "slice.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 //#include "stats.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30 #include "attributes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 #ifdef __i386__
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32 #include "mmx.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 //this is where we keep the state of the decoder
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 //picture_t picture_data;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 //picture_t *picture=&picture_data;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 picture_t *picture=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 //global config struct
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 mpeg2_config_t config;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 // the maximum chunk size is determined by vbv_buffer_size which is 224K for
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 // MP@ML streams. (we make no pretenses ofdecoding anything more than that)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 //static uint8_t chunk_buffer[224 * 1024 + 4];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 //static uint32_t shift = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 static int drop_flag = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 static int drop_frame = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 int quant_store[MBR+1][MBC+1]; // [Review]
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 void mpeg2_init (void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 printf (PACKAGE"-"VERSION" (C) 2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 config.flags = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 #ifdef HAVE_MMX
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 config.flags |= MM_ACCEL_X86_MMX;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 #ifdef HAVE_SSE
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 config.flags |= MM_ACCEL_X86_MMXEXT;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 #ifdef HAVE_3DNOW
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 config.flags |= MM_ACCEL_X86_3DNOW;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 #ifdef HAVE_MLIB
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 config.flags |= MM_ACCEL_MLIB;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 printf("libmpeg2 config flags = 0x%X\n",config.flags);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 picture=shmem_alloc(sizeof(picture_t)); // !!! NEW HACK :) !!!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 header_state_init (picture);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 picture->repeat_count=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 picture->pp_options=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 idct_init ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 motion_comp_init ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 void mpeg2_allocate_image_buffers (picture_t * picture)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 int frame_size,buff_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 unsigned char *base=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 // height+1 requires for yuv2rgb_mmx code (it reads next line after last)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 frame_size = picture->coded_picture_width * (1+picture->coded_picture_height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 frame_size = (frame_size+31)&(~31); // align to 32 byte boundary
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 buff_size = frame_size + (frame_size/4)*2; // 4Y + 1U + 1V
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 // allocate images in YV12 format
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 base = shmem_alloc(buff_size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 picture->throwaway_frame[0] = base;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 picture->throwaway_frame[1] = base + frame_size * 5 / 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 picture->throwaway_frame[2] = base + frame_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 base = shmem_alloc(buff_size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 picture->backward_reference_frame[0] = base;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 picture->backward_reference_frame[1] = base + frame_size * 5 / 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 picture->backward_reference_frame[2] = base + frame_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 base = shmem_alloc(buff_size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 picture->forward_reference_frame[0] = base;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 picture->forward_reference_frame[1] = base + frame_size * 5 / 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 picture->forward_reference_frame[2] = base + frame_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 base = shmem_alloc(buff_size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 picture->pp_frame[0] = base;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 picture->pp_frame[1] = base + frame_size * 5 / 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 picture->pp_frame[2] = base + frame_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 static void decode_reorder_frames (void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 if (picture->picture_coding_type != B_TYPE) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 //reuse the soon to be outdated forward reference frame
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 picture->current_frame[0] = picture->forward_reference_frame[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 picture->current_frame[1] = picture->forward_reference_frame[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 picture->current_frame[2] = picture->forward_reference_frame[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 //make the backward reference frame the new forward reference frame
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 picture->forward_reference_frame[0] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 picture->backward_reference_frame[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 picture->forward_reference_frame[1] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 picture->backward_reference_frame[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 picture->forward_reference_frame[2] =
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 picture->backward_reference_frame[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134 picture->backward_reference_frame[0] = picture->current_frame[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 picture->backward_reference_frame[1] = picture->current_frame[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 picture->backward_reference_frame[2] = picture->current_frame[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 picture->current_frame[0] = picture->throwaway_frame[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 picture->current_frame[1] = picture->throwaway_frame[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 picture->current_frame[2] = picture->throwaway_frame[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 static int in_slice_flag=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 static int parse_chunk (vo_functions_t * output, int code, uint8_t * buffer)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 int is_frame_done = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 stats_header (code, buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 is_frame_done = in_slice_flag && ((!code) || (code >= 0xb0));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 if (is_frame_done) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 in_slice_flag = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 if(picture->picture_structure != FRAME_PICTURE) printf("Field! %d \n",picture->second_field);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 if ( ((HACK_MODE == 2) || (picture->mpeg1))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 && ((picture->picture_structure == FRAME_PICTURE) ||
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 (picture->second_field))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 ) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 uint8_t ** bar;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 int stride[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if (picture->picture_coding_type == B_TYPE)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 bar = picture->throwaway_frame;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 bar = picture->forward_reference_frame;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 stride[0]=picture->coded_picture_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 stride[1]=stride[2]=stride[0]/2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 if(picture->pp_options){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 // apply OpenDivX postprocess filter
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 postprocess(bar, stride[0],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
179 picture->pp_frame, stride[0],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
180 picture->coded_picture_width, picture->coded_picture_height,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 &quant_store[1][1], (MBC+1), picture->pp_options);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 output->draw_slice (picture->pp_frame, stride,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 picture->display_picture_width,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 picture->display_picture_height, 0, 0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 output->draw_slice (bar, stride,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 picture->display_picture_width,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 picture->display_picture_height, 0, 0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 #ifdef ARCH_X86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 if (config.flags & MM_ACCEL_X86_MMX) emms ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 output->flip_page ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 switch (code) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 case 0x00: /* picture_start_code */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 if (header_process_picture_header (picture, buffer)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 printf ("bad picture header\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 exit (1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 drop_frame = drop_flag && (picture->picture_coding_type == B_TYPE);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 //decode_reorder_frames ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 case 0xb3: /* sequence_header_code */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 if (header_process_sequence_header (picture, buffer)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 printf ("bad sequence header\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 exit (1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 case 0xb5: /* extension_start_code */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 if (header_process_extension (picture, buffer)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 printf ("bad extension\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 exit (1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 default:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 // if (code >= 0xb9) printf ("stream not demultiplexed ?\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 if (code >= 0xb0) break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 if (!(in_slice_flag)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 in_slice_flag = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 if(!(picture->second_field)) decode_reorder_frames ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 if (!drop_frame) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 uint8_t ** bar;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 slice_process (picture, code, buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 if ((HACK_MODE < 2) && (!(picture->mpeg1))) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 uint8_t * foo[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 uint8_t ** bar;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 //frame_t * bar;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 int stride[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 int offset;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 if (picture->picture_coding_type == B_TYPE)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 bar = picture->throwaway_frame;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 bar = picture->forward_reference_frame;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 offset = (code-1) * 4 * picture->coded_picture_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 if ((! HACK_MODE) && (picture->picture_coding_type == B_TYPE))
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 offset = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 foo[0] = bar[0] + 4 * offset;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 foo[1] = bar[1] + offset;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 foo[2] = bar[2] + offset;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 stride[0]=picture->coded_picture_width;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 stride[1]=stride[2]=stride[0]/2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 output->draw_slice (foo, stride,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 picture->display_picture_width, 16, 0, (code-1)*16);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 #ifdef ARCH_X86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 if (config.flags & MM_ACCEL_X86_MMX) emms ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271 return is_frame_done;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275 int mpeg2_decode_data (vo_functions_t *output, uint8_t *current, uint8_t *end)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 //static uint8_t code = 0xff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 //static uint8_t chunk_buffer[65536];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 //static uint8_t *chunk_ptr = chunk_buffer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 //static uint32_t shift = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 uint8_t code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 uint8_t *pos=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 uint8_t *start=current;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 int ret = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 // printf("RCVD %d bytes\n",end-current);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 while(current<end){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 // FIND NEXT HEAD:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 unsigned int head=-1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 uint8_t c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 //--------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 while(current<end){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 c=current[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 ++current;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 head<<=8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 if(head==0x100) break; // synced
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 head|=c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300 //--------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 if(pos){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 //if((code&0x100)!=0x100) printf("libmpeg2: FATAL! code=%X\n",code);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303 //printf("pos=%d chunk %3X size=%d next-code=%X\n",pos-start,code,current-pos,head|c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 ret+=parse_chunk(output, code&0xFF, pos);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 //--------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 pos=current;code=head|c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 if(code==0x1FF) ret+=parse_chunk(output, 0xFF, NULL); // send 'end of frame'
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 return ret;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 void mpeg2_drop (int flag)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 drop_flag = flag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319