annotate libmpcodecs/vd_theora.c @ 32282:606e4157cd4c

Split alloc and init of context so that parameters can be set in the context instead of requireing being passed through function parameters. This also makes sws work with AVOptions.
author michael
date Sun, 26 Sep 2010 19:33:57 +0000
parents aff74c63b86d
children 55ff5df09657
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
30 #include "libavutil/intreadwrite.h"
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
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
2c4e30f37773 Theora fixes:
henry
parents: 14642
diff changeset
65 switch(cmd) {
2c4e30f37773 Theora fixes:
henry
parents: 14642
diff changeset
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
2c4e30f37773 Theora fixes:
henry
parents: 14642
diff changeset
68 return CONTROL_TRUE;
2c4e30f37773 Theora fixes:
henry
parents: 14642
diff changeset
69 return CONTROL_FALSE;
2c4e30f37773 Theora fixes:
henry
parents: 14642
diff changeset
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
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
80 uint8_t *extradata = (uint8_t *)(sh->bih + 1);
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
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
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
86 context = calloc (sizeof (theora_struct_t), 1);
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
87 sh->context = context;
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
88 if (!context)
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
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
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
91 theora_info_init(&context->inf);
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
92 theora_comment_init(&context->cc);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 21499
diff changeset
93
30527
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
94 /* Read all header packets, pass them to theora_decode_header. */
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
95 for (i = 0; i < THEORA_NUM_HEADER_PACKETS; i++)
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
96 {
30890
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
97 if (extradata_size > 2) {
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
98 op.bytes = AV_RB16(extradata);
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
99 op.packet = extradata + 2;
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
100 op.b_o_s = 1;
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
101 if (extradata_size < op.bytes + 2) {
31188
aff74c63b86d Use MSGT_DECVIDEO in a video decoder.
cehoyos
parents: 31149
diff changeset
102 mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Theora header too small\n");
30890
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
103 goto err_out;
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
104 }
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
105 extradata += op.bytes + 2;
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
106 extradata_size -= op.bytes + 2;
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
107 } else {
30891
fdcf76890a16 cosmetics: indentation
aurel
parents: 30890
diff changeset
108 op.bytes = ds_get_packet (sh->ds, &op.packet);
fdcf76890a16 cosmetics: indentation
aurel
parents: 30890
diff changeset
109 op.b_o_s = 1;
30890
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
110 }
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
111
30527
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
112 if ( (errorCode = theora_decode_header (&context->inf, &context->cc, &op)) )
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
113 {
31188
aff74c63b86d Use MSGT_DECVIDEO in a video decoder.
cehoyos
parents: 31149
diff changeset
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
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
116 }
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
117 }
10251
95dc2037fb27 just updated vd_theora.c to decode the additional header packets,
arpi
parents: 10094
diff changeset
118
30527
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
119 /* now init codec */
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
120 errorCode = theora_decode_init (&context->st, &context->inf);
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
121 if (errorCode)
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
122 {
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
123 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Theora decode init failed: %i \n", errorCode);
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
124 goto err_out;
058d4fc12058 Reindent
reimar
parents: 30526
diff changeset
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
828219ec9742 Remove useless casts.
reimar
parents: 30520
diff changeset
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
828219ec9742 Remove useless casts.
reimar
parents: 30520
diff changeset
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
aff74c63b86d Use MSGT_DECVIDEO in a video decoder.
cehoyos
parents: 31149
diff changeset
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
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
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
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
198
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
199 mpi->planes[0]=yuv.y;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
200 mpi->stride[0]=yuv.y_stride;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
201 mpi->planes[1]=yuv.u;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
202 mpi->stride[1]=yuv.uv_stride;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
203 mpi->planes[2]=yuv.v;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
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 }