annotate libmpcodecs/vd_libmpeg2.c @ 14685:4b02f759f529

small reordering to make future 'multiple files' changes more modular, puts single file loading separate from global option loading in the begginning. patch by Oded Shimon
author reynaldo
date Sat, 12 Feb 2005 15:11:02 +0000
parents 6d1b93ceeca1
children 6ff3379a0862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
1 #include <stdio.h>
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
2 #include <stdlib.h>
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
3
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
4 #include "config.h"
8026
b465ba5897a3 usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents: 7957
diff changeset
5 #ifdef USE_LIBMPEG2
b465ba5897a3 usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents: 7957
diff changeset
6
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
7 #include "mp_msg.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
8
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
9 #include "vd_internal.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
10
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
11 //#undef MPEG12_POSTPROC
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
12
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
13 static vd_info_t info =
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
14 {
12932
d0a8810e155c Importing libmpeg2 from mpeg2dec-0.4.0b
henry
parents: 12572
diff changeset
15 "MPEG 1/2 Video decoder libmpeg2-v0.4.0b",
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
16 "libmpeg2",
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
17 "A'rpi & Fabian Franz",
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
18 "Aaron & Walken",
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
19 "native"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
20 };
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
21
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
22 LIBVD_EXTERN(libmpeg2)
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
23
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
24 //#include "libvo/video_out.h" // FIXME!!!
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
25
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
26 #include "libmpeg2/mpeg2.h"
12932
d0a8810e155c Importing libmpeg2 from mpeg2dec-0.4.0b
henry
parents: 12572
diff changeset
27 #include "libmpeg2/attributes.h"
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
28 #include "libmpeg2/mpeg2_internal.h"
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
29
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
30 #include "../cpudetect.h"
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
31
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
32 // to set/get/query special features/parameters
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
33 static int control(sh_video_t *sh,int cmd,void* arg,...){
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
34 mpeg2dec_t * mpeg2dec = sh->context;
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
35 const mpeg2_info_t * info = mpeg2_info (mpeg2dec);
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
36
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
37 switch(cmd) {
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
38 case VDCTRL_QUERY_FORMAT:
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
39 if (info->sequence->width >> 1 == info->sequence->chroma_width &&
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
40 info->sequence->height >> 1 == info->sequence->chroma_height &&
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
41 (*((int*)arg)) == IMGFMT_YV12)
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
42 return CONTROL_TRUE;
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
43 if (info->sequence->width >> 1 == info->sequence->chroma_width &&
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
44 info->sequence->height == info->sequence->chroma_height &&
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
45 (*((int*)arg)) == IMGFMT_422P)
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
46 return CONTROL_TRUE;
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
47 return CONTROL_FALSE;
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
48 }
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
49
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
50 return CONTROL_UNKNOWN;
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
51 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
52
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
53 // init driver
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
54 static int init(sh_video_t *sh){
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
55 mpeg2dec_t * mpeg2dec;
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
56 // const mpeg2_info_t * info;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
57 int accel;
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
58
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
59 accel = 0;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
60 if(gCpuCaps.hasMMX)
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
61 accel |= MPEG2_ACCEL_X86_MMX;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
62 if(gCpuCaps.hasMMX2)
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
63 accel |= MPEG2_ACCEL_X86_MMXEXT;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
64 if(gCpuCaps.has3DNow)
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
65 accel |= MPEG2_ACCEL_X86_3DNOW;
10267
d953763cc555 libmpeg2-altivec patch by Magnus Damm <damm@opensource.se>:
arpi
parents: 10250
diff changeset
66 if(gCpuCaps.hasAltiVec)
d953763cc555 libmpeg2-altivec patch by Magnus Damm <damm@opensource.se>:
arpi
parents: 10250
diff changeset
67 accel |= MPEG2_ACCEL_PPC_ALTIVEC;
13117
9bba611637fb actually use the acceleration on SPARC
henry
parents: 13112
diff changeset
68 #ifdef HAVE_VIS
9bba611637fb actually use the acceleration on SPARC
henry
parents: 13112
diff changeset
69 accel |= MPEG2_ACCEL_SPARC_VIS;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
70 #endif
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
71 mpeg2_accel(accel);
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
72
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
73 mpeg2dec = mpeg2_init ();
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
74
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
75 if(!mpeg2dec) return 0;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
76
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
77 mpeg2_custom_fbuf(mpeg2dec,1); // enable DR1
5675
0ff1b9ab7afc slices+field pictures fixed, initial sig11 workaround
arpi
parents: 5613
diff changeset
78
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
79 sh->context=mpeg2dec;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
80
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
81 mpeg2dec->pending_buffer = 0;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
82 mpeg2dec->pending_length = 0;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
83
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
84 return 1;
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
85 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
86
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
87 // uninit driver
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
88 static void uninit(sh_video_t *sh){
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
89 mpeg2dec_t * mpeg2dec = sh->context;
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
90 if (mpeg2dec->pending_buffer) free(mpeg2dec->pending_buffer);
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
91 mpeg2dec->decoder.convert=NULL;
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
92 mpeg2dec->decoder.convert_id=NULL;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
93 mpeg2_close (mpeg2dec);
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
94 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
95
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
96 static void draw_slice (void * _sh, uint8_t * const * src, unsigned int y){
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
97 sh_video_t* sh = (sh_video_t*) _sh;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
98 mpeg2dec_t* mpeg2dec = sh->context;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
99 const mpeg2_info_t * info = mpeg2_info (mpeg2dec);
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
100 int stride[3];
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
101
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
102 // printf("draw_slice() y=%d \n",y);
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
103
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
104 stride[0]=mpeg2dec->decoder.stride;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
105 stride[1]=stride[2]=mpeg2dec->decoder.uv_stride;
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
106
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
107 mpcodecs_draw_slice(sh, (uint8_t **)src,
12572
7d681d8ebab8 display height may be a lot smaller or larger than picture height, sample provided by winnicki
iive
parents: 11080
diff changeset
108 stride, info->sequence->picture_width,
7d681d8ebab8 display height may be a lot smaller or larger than picture height, sample provided by winnicki
iive
parents: 11080
diff changeset
109 (y+16<=info->sequence->picture_height) ? 16 :
7d681d8ebab8 display height may be a lot smaller or larger than picture height, sample provided by winnicki
iive
parents: 11080
diff changeset
110 info->sequence->picture_height-y,
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
111 0, y);
4998
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
112 }
c32191b02a66 mpng, libmpeg2 added, none of them finished :(
arpi
parents:
diff changeset
113
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
114 // decode a frame
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
115 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
116 mpeg2dec_t * mpeg2dec = sh->context;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
117 const mpeg2_info_t * info = mpeg2_info (mpeg2dec);
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
118 int drop_frame, framedrop=flags&3;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
119
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
120 // MPlayer registers its own draw_slice callback, prevent libmpeg2 from freeing the context
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
121 mpeg2dec->decoder.convert=NULL;
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
122 mpeg2dec->decoder.convert_id=NULL;
13150
a7542243d695 some more segfault fixes
faust3
parents: 13139
diff changeset
123
11080
26f1b3ad4a77 skip null frames in mpeg files, patch by Zoltan Hidvegi <mplayer@hzoli.2y.net>
attila
parents: 10663
diff changeset
124 if(len<=0) return NULL; // skipped null frame
26f1b3ad4a77 skip null frames in mpeg files, patch by Zoltan Hidvegi <mplayer@hzoli.2y.net>
attila
parents: 10663
diff changeset
125
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
126 // append extra 'end of frame' code:
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
127 ((char*)data+len)[0]=0;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
128 ((char*)data+len)[1]=0;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
129 ((char*)data+len)[2]=1;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
130 ((char*)data+len)[3]=0xff;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
131 len+=4;
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
132
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
133 if (mpeg2dec->pending_length) {
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
134 mpeg2_buffer (mpeg2dec, mpeg2dec->pending_buffer, mpeg2dec->pending_buffer + mpeg2dec->pending_length);
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
135 } else {
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
136 mpeg2_buffer (mpeg2dec, data, data+len);
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
137 }
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
138
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
139 while(1){
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
140 int state=mpeg2_parse (mpeg2dec);
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
141 int type, use_callback;
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
142 mp_image_t* mpi_new;
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
143
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
144 switch(state){
12932
d0a8810e155c Importing libmpeg2 from mpeg2dec-0.4.0b
henry
parents: 12572
diff changeset
145 case STATE_BUFFER:
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
146 if (mpeg2dec->pending_length) {
13152
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
147 // just finished the pending data, continue with processing of the passed buffer
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
148 mpeg2dec->pending_length = 0;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
149 mpeg2_buffer (mpeg2dec, data, data+len);
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
150 } else {
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
151 // parsing of the passed buffer finished, return.
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
152 return 0;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
153 }
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
154 break;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
155 case STATE_SEQUENCE:
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
156 // video parameters inited/changed, (re)init libvo:
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
157 if (info->sequence->width >> 1 == info->sequence->chroma_width &&
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
158 info->sequence->height >> 1 == info->sequence->chroma_height) {
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
159 if(!mpcodecs_config_vo(sh,
14016
2b912d545edd fix segfault with (height|width)%6!=0
henry
parents: 14012
diff changeset
160 info->sequence->picture_width,
2b912d545edd fix segfault with (height|width)%6!=0
henry
parents: 14012
diff changeset
161 info->sequence->picture_height, IMGFMT_YV12)) return 0;
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
162 } else if (info->sequence->width >> 1 == info->sequence->chroma_width &&
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
163 info->sequence->height == info->sequence->chroma_height) {
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
164 if(!mpcodecs_config_vo(sh,
14016
2b912d545edd fix segfault with (height|width)%6!=0
henry
parents: 14012
diff changeset
165 info->sequence->picture_width,
2b912d545edd fix segfault with (height|width)%6!=0
henry
parents: 14012
diff changeset
166 info->sequence->picture_height, IMGFMT_422P)) return 0;
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
167 } else return 0;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
168 break;
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
169 case STATE_PICTURE:
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
170 type=info->current_picture->flags&PIC_MASK_CODING_TYPE;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
171
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
172 drop_frame = framedrop && (mpeg2dec->decoder.coding_type == B_TYPE);
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
173 drop_frame |= framedrop>=2; // hard drop
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
174 if (drop_frame) {
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
175 mpeg2_skip(mpeg2dec, 1);
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
176 //printf("Dropping Frame ...\n");
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
177 break;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
178 }
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
179 mpeg2_skip(mpeg2dec, 0); //mpeg2skip skips frames until set again to 0
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
180
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
181 use_callback = (!framedrop && vd_use_slices &&
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
182 (info->current_picture->flags&PIC_FLAG_PROGRESSIVE_FRAME)) ?
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
183 MP_IMGFLAG_DRAW_CALLBACK:0;
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
184
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
185 // get_buffer "callback":
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
186 mpi_new=mpcodecs_get_image(sh,MP_IMGTYPE_IPB,
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
187 (type==PIC_FLAG_CODING_TYPE_B) ?
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
188 use_callback : (MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE),
14075
6d1b93ceeca1 reserve enough memory for image
henry
parents: 14016
diff changeset
189 info->sequence->width,
6d1b93ceeca1 reserve enough memory for image
henry
parents: 14016
diff changeset
190 info->sequence->height);
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
191
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
192 if(!mpi_new) return 0; // VO ERROR!!!!!!!!
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
193 mpeg2_set_buf(mpeg2dec, mpi_new->planes, mpi_new);
10510
73b3e4336cd4 Add mpeg2_flags to mp_image_t, copy flags in vd_libmpeg2.c,
ranma
parents: 10267
diff changeset
194 if (info->current_picture->flags&PIC_FLAG_TOP_FIELD_FIRST)
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
195 mpi_new->fields |= MP_IMGFIELD_TOP_FIRST;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
196 else mpi_new->fields &= ~MP_IMGFIELD_TOP_FIRST;
10510
73b3e4336cd4 Add mpeg2_flags to mp_image_t, copy flags in vd_libmpeg2.c,
ranma
parents: 10267
diff changeset
197 if (info->current_picture->flags&PIC_FLAG_REPEAT_FIRST_FIELD)
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
198 mpi_new->fields |= MP_IMGFIELD_REPEAT_FIRST;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
199 else mpi_new->fields &= ~MP_IMGFIELD_REPEAT_FIRST;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
200 mpi_new->fields |= MP_IMGFIELD_ORDERED;
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
201
12935
cda4ad0d3e70 forgotten libmpeg2 postprocessing
henry
parents: 12932
diff changeset
202 #ifdef MPEG12_POSTPROC
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
203 if(!mpi_new->qscale){
14016
2b912d545edd fix segfault with (height|width)%6!=0
henry
parents: 14012
diff changeset
204 mpi_new->qstride=info->sequence->width>>4;
2b912d545edd fix segfault with (height|width)%6!=0
henry
parents: 14012
diff changeset
205 mpi_new->qscale=malloc(mpi_new->qstride*(info->sequence->height>>4));
12935
cda4ad0d3e70 forgotten libmpeg2 postprocessing
henry
parents: 12932
diff changeset
206 }
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
207 mpeg2dec->decoder.quant_store=mpi_new->qscale;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
208 mpeg2dec->decoder.quant_stride=mpi_new->qstride;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
209 mpi_new->pict_type=type; // 1->I, 2->P, 3->B
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
210 mpi_new->qscale_type= 1;
12935
cda4ad0d3e70 forgotten libmpeg2 postprocessing
henry
parents: 12932
diff changeset
211 #endif
cda4ad0d3e70 forgotten libmpeg2 postprocessing
henry
parents: 12932
diff changeset
212
14012
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
213 if (mpi_new->flags&MP_IMGFLAG_DRAW_CALLBACK
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
214 && !(mpi_new->flags&MP_IMGFLAG_DIRECT)) {
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
215 // nice, filter/vo likes draw_callback :)
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
216 mpeg2dec->decoder.convert=draw_slice;
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
217 mpeg2dec->decoder.convert_id=sh;
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
218 } else {
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
219 mpeg2dec->decoder.convert=NULL;
39d2df376d62 1e6l fix (use 422P instead of UYVY)
henry
parents: 13995
diff changeset
220 mpeg2dec->decoder.convert_id=NULL;
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
221 }
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
222
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
223 break;
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
224 case STATE_SLICE:
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
225 case STATE_END:
12932
d0a8810e155c Importing libmpeg2 from mpeg2dec-0.4.0b
henry
parents: 12572
diff changeset
226 case STATE_INVALID_END:
9859
16a7d1f4da38 Rewritten, to use new libmpeg2 0.3.1 API
arpi
parents: 8026
diff changeset
227 // decoding done:
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
228 if(info->display_fbuf) {
13152
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
229 mp_image_t* mpi = info->display_fbuf->id;
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
230 if (mpeg2dec->pending_length == 0) {
13995
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
231 mpeg2dec->pending_length = mpeg2dec->buf_end - mpeg2dec->buf_start;
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
232 mpeg2dec->pending_buffer = realloc(mpeg2dec->pending_buffer, mpeg2dec->pending_length);
cbadd7b190b2 libmpeg2 4:2:2 decoding
henry
parents: 13152
diff changeset
233 memcpy(mpeg2dec->pending_buffer, mpeg2dec->buf_start, mpeg2dec->pending_length);
13152
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
234 } else {
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
235 // still some data in the pending buffer, shouldn't happen
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
236 mpeg2dec->pending_length = mpeg2dec->buf_end - mpeg2dec->buf_start;
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
237 memmove(mpeg2dec->pending_buffer, mpeg2dec->buf_start, mpeg2dec->pending_length);
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
238 mpeg2dec->pending_buffer = realloc(mpeg2dec->pending_buffer, mpeg2dec->pending_length + len);
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
239 memcpy(mpeg2dec->pending_buffer+mpeg2dec->pending_length, data, len);
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
240 mpeg2dec->pending_length += len;
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
241 }
e264e6d6eb76 clenups
henry
parents: 13150
diff changeset
242 // fprintf(stderr, "pending = %d\n", mpeg2dec->pending_length);
13112
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
243 return mpi;
3e4bea88c1c1 libmpeg2 B-frame fix
henry
parents: 12935
diff changeset
244 }
7957
31fd09cc9ba2 passing picture_type (might be usefull for postprocessing)
michael
parents: 7756
diff changeset
245 }
31fd09cc9ba2 passing picture_type (might be usefull for postprocessing)
michael
parents: 7756
diff changeset
246 }
5465
1f9c8301a7f2 rewritten - it replaces libmpeg2/decode.c now
arpi
parents: 5360
diff changeset
247 }
8026
b465ba5897a3 usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents: 7957
diff changeset
248 #endif