Mercurial > mplayer.hg
annotate libmpcodecs/vd_theora.c @ 32439:2f1ccd169a7f
Improve vd_ffmpeg aspect handling to respect container aspect if possible
(i.e. until the first resolution or aspect change) and to use correct
aspect if only resolution changes but not the pixel aspect.
author | reimar |
---|---|
date | Fri, 22 Oct 2010 17:36:11 +0000 |
parents | aff74c63b86d |
children | 55ff5df09657 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
19 #include <stdio.h> |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
20 #include <stdlib.h> |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
21 #include <stdarg.h> |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
22 #include <assert.h> |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
23 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
24 #include "config.h" |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
25 #include "mp_msg.h" |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
26 #include "help_mp.h" |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
27 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
28 #include "vd_internal.h" |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
29 |
30890 | 30 #include "libavutil/intreadwrite.h" |
31 | |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
32 static const vd_info_t info = { |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
33 "Theora/VP3", |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
34 "theora", |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
35 "David Kuehling", |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
36 "www.theora.org", |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
37 "Theora project's VP3 codec" |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
38 }; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
39 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
40 LIBVD_EXTERN(theora) |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
41 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
42 #include <theora/theora.h> |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
43 |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10251
diff
changeset
|
44 #define THEORA_NUM_HEADER_PACKETS 3 |
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10251
diff
changeset
|
45 |
30543
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
46 typedef struct theora_struct_st { |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
47 theora_state st; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
48 theora_comment cc; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
49 theora_info inf; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
50 } theora_struct_t; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
51 |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
52 /** Convert Theora pixelformat to the corresponding IMGFMT_ */ |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
53 static uint32_t theora_pixelformat2imgfmt(theora_pixelformat fmt){ |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
54 switch(fmt) { |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
55 case OC_PF_420: return IMGFMT_YV12; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
56 case OC_PF_422: return IMGFMT_422P; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
57 case OC_PF_444: return IMGFMT_444P; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
58 } |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
59 return 0; |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
60 } |
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
61 |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
62 // to set/get/query special features/parameters |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
63 static int control(sh_video_t *sh,int cmd,void* arg,...){ |
30543
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
64 theora_struct_t *context = sh->context; |
14763 | 65 switch(cmd) { |
66 case VDCTRL_QUERY_FORMAT: | |
30543
ee0b9c3bbf29
Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents:
30527
diff
changeset
|
67 if (*(int*)arg == theora_pixelformat2imgfmt(context->inf.pixelformat)) |
14763 | 68 return CONTROL_TRUE; |
69 return CONTROL_FALSE; | |
70 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
21499
diff
changeset
|
71 |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
72 return CONTROL_UNKNOWN; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
73 } |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
74 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
75 /* |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
76 * init driver |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
77 */ |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
78 static int init(sh_video_t *sh){ |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
79 theora_struct_t *context = NULL; |
30890 | 80 uint8_t *extradata = (uint8_t *)(sh->bih + 1); |
81 int extradata_size = sh->bih->biSize - sizeof(*sh->bih); | |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
82 int errorCode = 0; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
83 ogg_packet op; |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10251
diff
changeset
|
84 int i; |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
85 |
30527 | 86 context = calloc (sizeof (theora_struct_t), 1); |
87 sh->context = context; | |
88 if (!context) | |
89 goto err_out; | |
10658
c5e7b34bfc19
Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents:
10251
diff
changeset
|
90 |
30527 | 91 theora_info_init(&context->inf); |
92 theora_comment_init(&context->cc); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
21499
diff
changeset
|
93 |
30527 | 94 /* Read all header packets, pass them to theora_decode_header. */ |
95 for (i = 0; i < THEORA_NUM_HEADER_PACKETS; i++) | |
96 { | |
30890 | 97 if (extradata_size > 2) { |
98 op.bytes = AV_RB16(extradata); | |
99 op.packet = extradata + 2; | |
100 op.b_o_s = 1; | |
101 if (extradata_size < op.bytes + 2) { | |
31188 | 102 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Theora header too small\n"); |
30890 | 103 goto err_out; |
104 } | |
105 extradata += op.bytes + 2; | |
106 extradata_size -= op.bytes + 2; | |
107 } else { | |
30891 | 108 op.bytes = ds_get_packet (sh->ds, &op.packet); |
109 op.b_o_s = 1; | |
30890 | 110 } |
111 | |
30527 | 112 if ( (errorCode = theora_decode_header (&context->inf, &context->cc, &op)) ) |
113 { | |
31188 | 114 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Broken Theora header; errorCode=%i!\n", errorCode); |
30526
68e260df472b
Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents:
30525
diff
changeset
|
115 goto err_out; |
30527 | 116 } |
117 } | |
10251
95dc2037fb27
just updated vd_theora.c to decode the additional header packets,
arpi
parents:
10094
diff
changeset
|
118 |
30527 | 119 /* now init codec */ |
120 errorCode = theora_decode_init (&context->st, &context->inf); | |
121 if (errorCode) | |
122 { | |
123 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode init failed: %i \n", errorCode); | |
124 goto err_out; | |
125 } | |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
126 |
12761
236b49c548a5
Use aspect ratio from Theora context. Patch by j at v2v dot cc
mosu
parents:
10658
diff
changeset
|
127 if(sh->aspect==0.0 && context->inf.aspect_denominator!=0) |
236b49c548a5
Use aspect ratio from Theora context. Patch by j at v2v dot cc
mosu
parents:
10658
diff
changeset
|
128 { |
31134
92755ba89e79
Ignore (but print out) offset with libtheora decoder.
cehoyos
parents:
30891
diff
changeset
|
129 sh->aspect = ((double)context->inf.aspect_numerator * context->inf.width)/ |
92755ba89e79
Ignore (but print out) offset with libtheora decoder.
cehoyos
parents:
30891
diff
changeset
|
130 ((double)context->inf.aspect_denominator * context->inf.height); |
12761
236b49c548a5
Use aspect ratio from Theora context. Patch by j at v2v dot cc
mosu
parents:
10658
diff
changeset
|
131 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
21499
diff
changeset
|
132 |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
133 mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Theora video init ok!\n"); |
31134
92755ba89e79
Ignore (but print out) offset with libtheora decoder.
cehoyos
parents:
30891
diff
changeset
|
134 mp_msg(MSGT_DECVIDEO,MSGL_INFO,"Frame: %dx%d, Picture %dx%d, Offset [%d,%d]\n", context->inf.width, context->inf.height, context->inf.frame_width, context->inf.frame_height, context->inf.offset_x, context->inf.offset_y); |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
135 |
31134
92755ba89e79
Ignore (but print out) offset with libtheora decoder.
cehoyos
parents:
30891
diff
changeset
|
136 return mpcodecs_config_vo (sh,context->inf.width,context->inf.height,theora_pixelformat2imgfmt(context->inf.pixelformat)); |
30526
68e260df472b
Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents:
30525
diff
changeset
|
137 |
68e260df472b
Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents:
30525
diff
changeset
|
138 err_out: |
68e260df472b
Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents:
30525
diff
changeset
|
139 free(context); |
68e260df472b
Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents:
30525
diff
changeset
|
140 sh->context = NULL; |
68e260df472b
Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents:
30525
diff
changeset
|
141 return 0; |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
142 } |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
143 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
21499
diff
changeset
|
144 /* |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
145 * uninit driver |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
146 */ |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
147 static void uninit(sh_video_t *sh) |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
148 { |
30521 | 149 theora_struct_t *context = sh->context; |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
150 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
151 if (context) |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
152 { |
21499
2e6ebc42fa9a
Fix memleak in theora decoder due to missing theora_comment_/theora_info_clear on uninit
reimar
parents:
18976
diff
changeset
|
153 theora_info_clear(&context->inf); |
2e6ebc42fa9a
Fix memleak in theora decoder due to missing theora_comment_/theora_info_clear on uninit
reimar
parents:
18976
diff
changeset
|
154 theora_comment_clear(&context->cc); |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
155 theora_clear (&context->st); |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
156 free (context); |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
157 } |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
158 } |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
159 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
160 /* |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
161 * decode frame |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
162 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
21499
diff
changeset
|
163 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags) |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
164 { |
30521 | 165 theora_struct_t *context = sh->context; |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
166 int errorCode = 0; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
167 ogg_packet op; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
168 yuv_buffer yuv; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
169 mp_image_t* mpi; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
170 |
31149
8b1a6a6cda36
Avoid decoding of 0-size packets. This also fixes that the main loop believes
reimar
parents:
31134
diff
changeset
|
171 // no delayed frames |
8b1a6a6cda36
Avoid decoding of 0-size packets. This also fixes that the main loop believes
reimar
parents:
31134
diff
changeset
|
172 if (!data || !len) |
8b1a6a6cda36
Avoid decoding of 0-size packets. This also fixes that the main loop believes
reimar
parents:
31134
diff
changeset
|
173 return NULL; |
8b1a6a6cda36
Avoid decoding of 0-size packets. This also fixes that the main loop believes
reimar
parents:
31134
diff
changeset
|
174 |
14642
38572280e8e7
bzero is deprecated patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
12761
diff
changeset
|
175 memset (&op, 0, sizeof (op)); |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
176 op.bytes = len; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
177 op.packet = data; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
178 op.granulepos = -1; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
179 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
180 errorCode = theora_decode_packetin (&context->st, &op); |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
181 if (errorCode) |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
182 { |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
183 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode packetin failed: %i \n", |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
184 errorCode); |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
185 return NULL; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
186 } |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
187 |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
188 errorCode = theora_decode_YUVout (&context->st, &yuv); |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
189 if (errorCode) |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
190 { |
31188 | 191 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode YUVout failed: %i \n", |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
192 errorCode); |
30523
9ac2056fc4df
Return NULL instead of 0 for function returning a pointer.
reimar
parents:
30521
diff
changeset
|
193 return NULL; |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
194 } |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
195 |
14781 | 196 mpi = mpcodecs_get_image(sh, MP_IMGTYPE_EXPORT, 0, yuv.y_width, yuv.y_height); |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
197 if(!mpi) return NULL; |
14781 | 198 |
199 mpi->planes[0]=yuv.y; | |
200 mpi->stride[0]=yuv.y_stride; | |
201 mpi->planes[1]=yuv.u; | |
202 mpi->stride[1]=yuv.uv_stride; | |
203 mpi->planes[2]=yuv.v; | |
204 mpi->stride[2]=yuv.uv_stride; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
21499
diff
changeset
|
205 |
10094
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
206 return mpi; |
5730f6098f98
theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff
changeset
|
207 } |