annotate libmpeg2/decode.c @ 1346:d6e6132bff35

AUDIO_ENCODING_LINEAR8 format is not available on sunos 5.5. Format is unsupported in mplayer for now, to get the code compiled on that old version of the OS.
author jkeil
date Thu, 19 Jul 2001 20:04:54 +0000
parents 5f07e67982d6
children 3c33deb3e561
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"
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
6 #define VERSION "0.2.0-release"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 #include <unistd.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11 #include <fcntl.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 #include <errno.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
14 #include <signal.h>
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
15 #include <setjmp.h>
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
16
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
17
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 #include "config.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
20 #include "video_out.h"
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
21 #include <inttypes.h>
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23 #include "mpeg2.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 #include "mpeg2_internal.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 #include "../linux/shmem.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 //#include "motion_comp.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29 //#include "idct.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
30 //#include "header.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 //#include "slice.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32 //#include "stats.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34 #include "attributes.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 #ifdef __i386__
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 #include "mmx.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
39 #include "mm_accel.h"
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
40
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
41
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 //this is where we keep the state of the decoder
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 //picture_t picture_data;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 //picture_t *picture=&picture_data;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 picture_t *picture=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 //global config struct
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 mpeg2_config_t config;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 // the maximum chunk size is determined by vbv_buffer_size which is 224K for
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 // MP@ML streams. (we make no pretenses ofdecoding anything more than that)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 //static uint8_t chunk_buffer[224 * 1024 + 4];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 //static uint32_t shift = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
55 //static int drop_flag = 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 static int drop_frame = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
58 #ifdef MPEG12_POSTPROC
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 int quant_store[MBR+1][MBC+1]; // [Review]
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
60 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 void mpeg2_init (void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64
499
3601edb3805c printfs changed...
arpi_esp
parents: 204
diff changeset
65 printf (PACKAGE"-"VERSION" (C) 2000-2001 Aaron Holtzman & Michel Lespinasse\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 config.flags = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 #ifdef HAVE_MMX
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68 config.flags |= MM_ACCEL_X86_MMX;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 #ifdef HAVE_SSE
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 config.flags |= MM_ACCEL_X86_MMXEXT;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 #ifdef HAVE_3DNOW
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 config.flags |= MM_ACCEL_X86_3DNOW;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 #ifdef HAVE_MLIB
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 config.flags |= MM_ACCEL_MLIB;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79
499
3601edb3805c printfs changed...
arpi_esp
parents: 204
diff changeset
80 // printf("libmpeg2 config flags = 0x%X\n",config.flags);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 picture=shmem_alloc(sizeof(picture_t)); // !!! NEW HACK :) !!!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 header_state_init (picture);
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
85 // picture->repeat_count=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 picture->pp_options=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 idct_init ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 motion_comp_init ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
93 static vo_frame_t frames[4];
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
94
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 void mpeg2_allocate_image_buffers (picture_t * picture)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 int frame_size,buff_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 unsigned char *base=NULL;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
99 int i;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 // height+1 requires for yuv2rgb_mmx code (it reads next line after last)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 frame_size = picture->coded_picture_width * (1+picture->coded_picture_height);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 frame_size = (frame_size+31)&(~31); // align to 32 byte boundary
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 buff_size = frame_size + (frame_size/4)*2; // 4Y + 1U + 1V
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 // allocate images in YV12 format
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
107 #ifdef MPEG12_POSTPROC
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
108 for(i=0;i<4;i++){
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
109 #else
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
110 for(i=0;i<3;i++){
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
111 #endif
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
112 base = shmem_alloc(buff_size);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
113 frames[i].base[0] = base;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
114 frames[i].base[1] = base + frame_size * 5 / 4;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
115 frames[i].base[2] = base + frame_size;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
116 frames[i].copy = NULL;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
117 frames[i].vo = NULL;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
118 }
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
119
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
120 picture->forward_reference_frame=&frames[0];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
121 picture->backward_reference_frame=&frames[1];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
122 picture->current_frame=&frames[2];
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
126 static void copy_slice (vo_frame_t * frame, uint8_t ** src){
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
127 vo_functions_t * output = frame->vo;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
128 int stride[3];
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
129 int y=picture->slice<<4;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
130 uint8_t* src_tmp[3];
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
132 stride[0]=picture->coded_picture_width;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
133 stride[1]=stride[2]=stride[0]/2;
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
134
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
135 if(frame!=picture->display_frame){
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
136 uint8_t** base=picture->display_frame->base;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
137 src_tmp[0]=base[0]+stride[0]*y;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
138 src_tmp[1]=base[1]+stride[1]*(y>>1);
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
139 src_tmp[2]=base[2]+stride[2]*(y>>1);
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
140 src=src_tmp;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
141 }
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
142
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
143 output->draw_slice (src,
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
144 stride, picture->display_picture_width,
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
145 (y+16<=picture->display_picture_height) ? 16 :
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
146 picture->display_picture_height-y,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
147 0, y);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
149 ++picture->slice;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 static int in_slice_flag=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
154 static int parse_chunk (vo_functions_t * output, int code, uint8_t * buffer, int framedrop)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 int is_frame_done = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 stats_header (code, buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 is_frame_done = in_slice_flag && ((!code) || (code >= 0xb0));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 if (is_frame_done) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 in_slice_flag = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
164 // if(picture->picture_structure != FRAME_PICTURE) printf("Field! %d \n",picture->second_field);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
166 if(!framedrop)
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
167 if (((picture->picture_structure == FRAME_PICTURE) ||
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 (picture->second_field))
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
169 ) {
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
170 #ifdef MPEG12_POSTPROC
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
171 if(picture->pp_options){
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
172 // apply OpenDivX postprocess filter
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
173 int stride[3];
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
174 stride[0]=picture->coded_picture_width;
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
175 stride[1]=stride[2]=stride[0]/2;
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
176 postprocess((picture->picture_coding_type == B_TYPE) ?
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
177 picture->current_frame->base :
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
178 picture->forward_reference_frame->base,
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
179 stride[0], frames[3].base, stride[0],
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
180 picture->coded_picture_width, picture->coded_picture_height,
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
181 &quant_store[1][1], (MBC+1), picture->pp_options);
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
182 output->draw_slice (frames[3].base, stride,
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
183 picture->display_picture_width,
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
184 picture->display_picture_height, 0, 0);
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
185 }// else
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
186 #endif
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
187 #if 0
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
188 if (picture->picture_coding_type != B_TYPE) {
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
189 int stride[3];
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
190 stride[0]=picture->coded_picture_width;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
191 stride[1]=stride[2]=stride[0]/2;
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
192 output->draw_slice (picture->forward_reference_frame->base,
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
193 stride,
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 picture->display_picture_width,
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 picture->display_picture_height, 0, 0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 }
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
197 #endif
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
198 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 #ifdef ARCH_X86
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
200 if (config.flags & MM_ACCEL_X86_MMX) emms();
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 #endif
116
a6bba36c8db7 vo->flip_page() call removed
arpi_esp
parents: 114
diff changeset
202 // output->flip_page();
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 switch (code) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 case 0x00: /* picture_start_code */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 if (header_process_picture_header (picture, buffer)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 printf ("bad picture header\n");
114
47515462adc0 removed exit(1);
arpi_esp
parents: 111
diff changeset
209 //exit (1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
212 drop_frame = framedrop && (picture->picture_coding_type == B_TYPE);
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
213 drop_frame |= framedrop>=2; // hard drop
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 //decode_reorder_frames ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 case 0xb3: /* sequence_header_code */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 if (header_process_sequence_header (picture, buffer)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 printf ("bad sequence header\n");
114
47515462adc0 removed exit(1);
arpi_esp
parents: 111
diff changeset
220 //exit (1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 case 0xb5: /* extension_start_code */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 if (header_process_extension (picture, buffer)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 printf ("bad extension\n");
114
47515462adc0 removed exit(1);
arpi_esp
parents: 111
diff changeset
227 //exit (1);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 default:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 // if (code >= 0xb9) printf ("stream not demultiplexed ?\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 if (code >= 0xb0) break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 if (!(in_slice_flag)) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 in_slice_flag = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
238 // if(!(picture->second_field)) decode_reorder_frames ();
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
239
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
240 // set current_frame pointer:
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
241 if (picture->second_field){
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
242 // vo_field (picture->current_frame, picture->picture_structure);
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
243 } else {
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
244 if (picture->picture_coding_type == B_TYPE){
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
245 picture->display_frame=
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
246 picture->current_frame = &frames[2];
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
247 // picture->current_frame->copy=copy_slice;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
248 } else {
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
249 picture->current_frame = picture->forward_reference_frame;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
250 picture->display_frame=
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
251 picture->forward_reference_frame = picture->backward_reference_frame;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
252 picture->backward_reference_frame = picture->current_frame;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
253 // picture->current_frame->copy=NULL;
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
254 }
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
255 }
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
256
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
257 #if 1
41
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
258 #ifdef MPEG12_POSTPROC
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
259 if(picture->pp_options)
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
260 picture->current_frame->copy=NULL; else
0d76b2b962ad added mpeg 1/2 postprocessing
arpi_esp
parents: 36
diff changeset
261 #endif
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
262 picture->current_frame->copy=copy_slice;
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
263 #endif
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
264 if(framedrop) picture->current_frame->copy=NULL;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
265 picture->current_frame->vo=output;
79
b7b038ee3fde backward-frame rendering by slices
arpi_esp
parents: 41
diff changeset
266 picture->slice=0;
36
846535ace7a2 libmpeg2-0.2.0 merge
arpi_esp
parents: 1
diff changeset
267
1
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 if (!drop_frame) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 slice_process (picture, code, buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274 #ifdef ARCH_X86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275 if (config.flags & MM_ACCEL_X86_MMX) emms ();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 return is_frame_done;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
284 static jmp_buf mpeg2_jmp_buf;
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
285
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
286 static void mpeg2_sighandler(int sig){
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
287 longjmp(mpeg2_jmp_buf,1);
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
288 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
290 int mpeg2_decode_data (vo_functions_t *output, uint8_t *current, uint8_t *end,int framedrop)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 //static uint8_t code = 0xff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 //static uint8_t chunk_buffer[65536];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 //static uint8_t *chunk_ptr = chunk_buffer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 //static uint32_t shift = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 uint8_t code;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 uint8_t *pos=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 uint8_t *start=current;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 int ret = 0;
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
300 void* old_sigh;
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
301
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
302 if(setjmp(mpeg2_jmp_buf)!=0){
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
303 printf("@@@ FATAL!!!??? libmpeg2 returned from sig11 before the actual decoding! @@@\n");
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
304 return 0;
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
305 }
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
306
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
307 old_sigh=signal(SIGSEGV,mpeg2_sighandler);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 // printf("RCVD %d bytes\n",end-current);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 while(current<end){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 // FIND NEXT HEAD:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 unsigned int head=-1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314 uint8_t c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 //--------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 while(current<end){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 c=current[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 ++current;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 head<<=8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 if(head==0x100) break; // synced
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 head|=c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 //--------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 if(pos){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 //if((code&0x100)!=0x100) printf("libmpeg2: FATAL! code=%X\n",code);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 //printf("pos=%d chunk %3X size=%d next-code=%X\n",pos-start,code,current-pos,head|c);
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
327 if(setjmp(mpeg2_jmp_buf)==0){
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
328 ret+=parse_chunk(output, code&0xFF, pos, framedrop);
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
329 } else {
204
56f4cfbcadd5 MMX fix (missing emms() in sig11handler)
arpi_esp
parents: 116
diff changeset
330 #ifdef ARCH_X86
56f4cfbcadd5 MMX fix (missing emms() in sig11handler)
arpi_esp
parents: 116
diff changeset
331 if (config.flags & MM_ACCEL_X86_MMX) emms ();
56f4cfbcadd5 MMX fix (missing emms() in sig11handler)
arpi_esp
parents: 116
diff changeset
332 #endif
499
3601edb3805c printfs changed...
arpi_esp
parents: 204
diff changeset
333 printf("@@@ libmpeg2 returned from sig11... (bad file?) @@@\n");
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
334 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 //--------------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 pos=current;code=head|c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339
111
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
340 signal(SIGSEGV,old_sigh); // restore sighandler
3b4ccfecb823 using setjmp/longjmp to handle sig11 in libmpeg2
arpi_esp
parents: 79
diff changeset
341
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
342 if(code==0x1FF) ret+=parse_chunk(output, 0xFF, NULL, framedrop); // send 'end of frame'
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344 return ret;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346
967
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
347 //void mpeg2_drop (int flag)
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
348 //{
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
349 // drop_flag = flag;
5f07e67982d6 -framedrop worx fro mpeg files
arpi_esp
parents: 499
diff changeset
350 //}
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351