annotate libmpcodecs/vd_theora.c @ 31076:783f8faee539

Put symlinks under revision control instead of generating them during make. This simplifies the build system and should have no practical disadvantage.
author diego
date Mon, 03 May 2010 23:00:58 +0000
parents fdcf76890a16
children 92755ba89e79
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) {
1c92dce71f3d add support for lavf style extradata in vd_theora
aurel
parents: 30543
diff changeset
102 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Theora header too small\n");
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 {
10658
c5e7b34bfc19 Theora-CVS update patch by Martin Drab <drab@kepler.fjfi.cvut.cz>
alex
parents: 10251
diff changeset
114 mp_msg(MSGT_DECAUDIO, 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 {
30525
956bdcb944aa Change aspect calculation code to switch to floating point earlier so integer
reimar
parents: 30523
diff changeset
129 sh->aspect = ((double)context->inf.aspect_numerator * context->inf.frame_width)/
956bdcb944aa Change aspect calculation code to switch to floating point earlier so integer
reimar
parents: 30523
diff changeset
130 ((double)context->inf.aspect_denominator * context->inf.frame_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");
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
134
30543
ee0b9c3bbf29 Add support for decoding 4:2:2 and 4:4:4 Theora files.
reimar
parents: 30527
diff changeset
135 return mpcodecs_config_vo (sh,context->inf.frame_width,context->inf.frame_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
136
68e260df472b Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents: 30525
diff changeset
137 err_out:
68e260df472b Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents: 30525
diff changeset
138 free(context);
68e260df472b Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents: 30525
diff changeset
139 sh->context = NULL;
68e260df472b Just use goto instead of reimplementing it badly with a do { } while (0) and
reimar
parents: 30525
diff changeset
140 return 0;
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
141 }
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
142
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 21499
diff changeset
143 /*
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
144 * uninit driver
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
145 */
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
146 static void uninit(sh_video_t *sh)
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
147 {
30521
828219ec9742 Remove useless casts.
reimar
parents: 30520
diff changeset
148 theora_struct_t *context = sh->context;
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
149
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
150 if (context)
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
151 {
21499
2e6ebc42fa9a Fix memleak in theora decoder due to missing theora_comment_/theora_info_clear on uninit
reimar
parents: 18976
diff changeset
152 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
153 theora_comment_clear(&context->cc);
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
154 theora_clear (&context->st);
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
155 free (context);
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
156 }
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 * decode frame
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
161 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 21499
diff changeset
162 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
163 {
30521
828219ec9742 Remove useless casts.
reimar
parents: 30520
diff changeset
164 theora_struct_t *context = sh->context;
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
165 int errorCode = 0;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
166 ogg_packet op;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
167 yuv_buffer yuv;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
168 mp_image_t* mpi;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
169
14642
38572280e8e7 bzero is deprecated patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents: 12761
diff changeset
170 memset (&op, 0, sizeof (op));
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
171 op.bytes = len;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
172 op.packet = data;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
173 op.granulepos = -1;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
174
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
175 errorCode = theora_decode_packetin (&context->st, &op);
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
176 if (errorCode)
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
177 {
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
178 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
179 errorCode);
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
180 return NULL;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
181 }
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 errorCode = theora_decode_YUVout (&context->st, &yuv);
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
184 if (errorCode)
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
185 {
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
186 mp_msg(MSGT_DEMUX,MSGL_ERR,"Theora decode YUVout failed: %i \n",
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
187 errorCode);
30523
9ac2056fc4df Return NULL instead of 0 for function returning a pointer.
reimar
parents: 30521
diff changeset
188 return NULL;
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
189 }
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
190
14781
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
191 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
192 if(!mpi) return NULL;
14781
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
193
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
194 mpi->planes[0]=yuv.y;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
195 mpi->stride[0]=yuv.y_stride;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
196 mpi->planes[1]=yuv.u;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
197 mpi->stride[1]=yuv.uv_stride;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
198 mpi->planes[2]=yuv.v;
28e19750b448 revert the flip part of vd_theora fix
henry
parents: 14763
diff changeset
199 mpi->stride[2]=yuv.uv_stride;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 21499
diff changeset
200
10094
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
201 return mpi;
5730f6098f98 theora video decoder, based on patch by David Kuehling <dvdkhlng@gmx.de>
arpi
parents:
diff changeset
202 }