Mercurial > libavcodec.hg
annotate libschroedingerdec.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | ffb3668ff7af |
children |
rev | line source |
---|---|
6738 | 1 /* |
2 * Dirac decoder support via Schroedinger libraries | |
3 * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com > | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
23 * @file |
6738 | 24 * Dirac decoder support via libschroedinger-1.0 libraries. More details about |
25 * the Schroedinger project can be found at http://www.diracvideo.org/. | |
26 * The library implements Dirac Specification Version 2.2. | |
27 * (http://dirac.sourceforge.net/specification.html). | |
28 */ | |
29 | |
12376
7e9b2d528e59
Fix the compilation of some libavcodec/lib* files which were not
stefano
parents:
12372
diff
changeset
|
30 #include "libavcore/imgutils.h" |
6738 | 31 #include "avcodec.h" |
32 #include "libdirac_libschro.h" | |
33 #include "libschroedinger.h" | |
34 | |
35 #undef NDEBUG | |
36 #include <assert.h> | |
37 | |
38 | |
39 #include <schroedinger/schro.h> | |
40 #include <schroedinger/schrodebug.h> | |
41 #include <schroedinger/schrovideoformat.h> | |
42 | |
43 /** libschroedinger decoder private data */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
44 typedef struct FfmpegSchroDecoderParams { |
6738 | 45 /** Schroedinger video format */ |
46 SchroVideoFormat *format; | |
47 | |
48 /** Schroedinger frame format */ | |
49 SchroFrameFormat frame_format; | |
50 | |
51 /** decoder handle */ | |
52 SchroDecoder* decoder; | |
53 | |
54 /** queue storing decoded frames */ | |
55 FfmpegDiracSchroQueue dec_frame_queue; | |
56 | |
57 /** end of sequence signalled */ | |
58 int eos_signalled; | |
59 | |
60 /** end of sequence pulled */ | |
61 int eos_pulled; | |
62 | |
63 /** decoded picture */ | |
64 AVPicture dec_pic; | |
65 } FfmpegSchroDecoderParams; | |
66 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
67 typedef struct FfmpegSchroParseUnitContext { |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
68 const uint8_t *buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
69 int buf_size; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
70 } FfmpegSchroParseUnitContext; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
71 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
72 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
73 static void libschroedinger_decode_buffer_free(SchroBuffer *schro_buf, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
74 void *priv); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
75 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
76 static void FfmpegSchroParseContextInit(FfmpegSchroParseUnitContext *parse_ctx, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
77 const uint8_t *buf, int buf_size) |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
78 { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
79 parse_ctx->buf = buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
80 parse_ctx->buf_size = buf_size; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
81 } |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
82 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
83 static SchroBuffer* FfmpegFindNextSchroParseUnit(FfmpegSchroParseUnitContext *parse_ctx) |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
84 { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
85 SchroBuffer *enc_buf = NULL; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
86 int next_pu_offset = 0; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
87 unsigned char *in_buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
88 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
89 if (parse_ctx->buf_size < 13 || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
90 parse_ctx->buf[0] != 'B' || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
91 parse_ctx->buf[1] != 'B' || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
92 parse_ctx->buf[2] != 'C' || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
93 parse_ctx->buf[3] != 'D') |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
94 return NULL; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
95 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
96 next_pu_offset = (parse_ctx->buf[5] << 24) + |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
97 (parse_ctx->buf[6] << 16) + |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
98 (parse_ctx->buf[7] << 8) + |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
99 parse_ctx->buf[8]; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
100 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
101 if (next_pu_offset == 0 && |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
102 SCHRO_PARSE_CODE_IS_END_OF_SEQUENCE(parse_ctx->buf[4])) |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
103 next_pu_offset = 13; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
104 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
105 if (next_pu_offset <= 0 || parse_ctx->buf_size < next_pu_offset) |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
106 return NULL; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
107 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
108 in_buf = av_malloc(next_pu_offset); |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
109 memcpy(in_buf, parse_ctx->buf, next_pu_offset); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
110 enc_buf = schro_buffer_new_with_data(in_buf, next_pu_offset); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
111 enc_buf->free = libschroedinger_decode_buffer_free; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
112 enc_buf->priv = in_buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
113 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
114 parse_ctx->buf += next_pu_offset; |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
115 parse_ctx->buf_size -= next_pu_offset; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
116 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
117 return enc_buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
118 } |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
119 |
6738 | 120 /** |
121 * Returns FFmpeg chroma format. | |
122 */ | |
123 static enum PixelFormat GetFfmpegChromaFormat(SchroChromaFormat schro_pix_fmt) | |
124 { | |
125 int num_formats = sizeof(ffmpeg_schro_pixel_format_map) / | |
126 sizeof(ffmpeg_schro_pixel_format_map[0]); | |
127 int idx; | |
128 | |
10056
646065f63290
Remove useless braces around if/for/while expressions.
diego
parents:
10055
diff
changeset
|
129 for (idx = 0; idx < num_formats; ++idx) |
646065f63290
Remove useless braces around if/for/while expressions.
diego
parents:
10055
diff
changeset
|
130 if (ffmpeg_schro_pixel_format_map[idx].schro_pix_fmt == schro_pix_fmt) |
6738 | 131 return ffmpeg_schro_pixel_format_map[idx].ff_pix_fmt; |
132 return PIX_FMT_NONE; | |
133 } | |
134 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
135 static av_cold int libschroedinger_decode_init(AVCodecContext *avccontext) |
6738 | 136 { |
137 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
138 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; |
6738 | 139 /* First of all, initialize our supporting libraries. */ |
140 schro_init(); | |
141 | |
142 schro_debug_set_level(avccontext->debug); | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
143 p_schro_params->decoder = schro_decoder_new(); |
6738 | 144 schro_decoder_set_skip_ratio(p_schro_params->decoder, 1); |
145 | |
146 if (!p_schro_params->decoder) | |
147 return -1; | |
148 | |
149 /* Initialize the decoded frame queue. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
150 ff_dirac_schro_queue_init(&p_schro_params->dec_frame_queue); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
151 return 0; |
6738 | 152 } |
153 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
154 static void libschroedinger_decode_buffer_free(SchroBuffer *schro_buf, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
155 void *priv) |
6738 | 156 { |
157 av_freep(&priv); | |
158 } | |
159 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
160 static void libschroedinger_decode_frame_free(void *frame) |
6738 | 161 { |
162 schro_frame_unref(frame); | |
163 } | |
164 | |
165 static void libschroedinger_handle_first_access_unit(AVCodecContext *avccontext) | |
166 { | |
167 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
168 SchroDecoder *decoder = p_schro_params->decoder; | |
169 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
170 p_schro_params->format = schro_decoder_get_video_format(decoder); |
6738 | 171 |
172 /* Tell FFmpeg about sequence details. */ | |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12376
diff
changeset
|
173 if (av_image_check_size(p_schro_params->format->width, p_schro_params->format->height, |
12372
914f484bb476
Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents:
11644
diff
changeset
|
174 0, avccontext) < 0) { |
6738 | 175 av_log(avccontext, AV_LOG_ERROR, "invalid dimensions (%dx%d)\n", |
176 p_schro_params->format->width, p_schro_params->format->height); | |
177 avccontext->height = avccontext->width = 0; | |
6754 | 178 return; |
6738 | 179 } |
180 avccontext->height = p_schro_params->format->height; | |
181 avccontext->width = p_schro_params->format->width; | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
182 avccontext->pix_fmt = GetFfmpegChromaFormat(p_schro_params->format->chroma_format); |
6738 | 183 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
184 if (ff_get_schro_frame_format(p_schro_params->format->chroma_format, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
185 &p_schro_params->frame_format) == -1) { |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
186 av_log(avccontext, AV_LOG_ERROR, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
187 "This codec currently only supports planar YUV 4:2:0, 4:2:2 " |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
188 "and 4:4:4 formats.\n"); |
6754 | 189 return; |
6738 | 190 } |
191 | |
192 avccontext->time_base.den = p_schro_params->format->frame_rate_numerator; | |
193 avccontext->time_base.num = p_schro_params->format->frame_rate_denominator; | |
194 | |
10055 | 195 if (!p_schro_params->dec_pic.data[0]) |
6738 | 196 avpicture_alloc(&p_schro_params->dec_pic, |
197 avccontext->pix_fmt, | |
198 avccontext->width, | |
199 avccontext->height); | |
200 } | |
201 | |
202 static int libschroedinger_decode_frame(AVCodecContext *avccontext, | |
203 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
204 AVPacket *avpkt) |
6738 | 205 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
206 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
207 int buf_size = avpkt->size; |
6738 | 208 |
209 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
210 SchroDecoder *decoder = p_schro_params->decoder; | |
211 SchroVideoFormat *format; | |
212 AVPicture *picture = data; | |
213 SchroBuffer *enc_buf; | |
214 SchroFrame* frame; | |
215 int state; | |
216 int go = 1; | |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
217 int outer = 1; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
218 FfmpegSchroParseUnitContext parse_ctx; |
6738 | 219 |
220 *data_size = 0; | |
221 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
222 FfmpegSchroParseContextInit(&parse_ctx, buf, buf_size); |
10055 | 223 if (!buf_size) { |
6738 | 224 if (!p_schro_params->eos_signalled) { |
225 state = schro_decoder_push_end_of_stream(decoder); | |
226 p_schro_params->eos_signalled = 1; | |
227 } | |
228 } | |
229 | |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
230 /* Loop through all the individual parse units in the input buffer */ |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
231 do { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
232 if ((enc_buf = FfmpegFindNextSchroParseUnit(&parse_ctx))) { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
233 /* Push buffer into decoder. */ |
8422
e623323d409f
Fix incorrectly constructed Dirac parse units that caused A/V sync loss.
diego
parents:
7234
diff
changeset
|
234 if (SCHRO_PARSE_CODE_IS_PICTURE(enc_buf->data[4]) && |
e623323d409f
Fix incorrectly constructed Dirac parse units that caused A/V sync loss.
diego
parents:
7234
diff
changeset
|
235 SCHRO_PARSE_CODE_NUM_REFS(enc_buf->data[4]) > 0) |
e623323d409f
Fix incorrectly constructed Dirac parse units that caused A/V sync loss.
diego
parents:
7234
diff
changeset
|
236 avccontext->has_b_frames = 1; |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
237 state = schro_decoder_push(decoder, enc_buf); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
238 if (state == SCHRO_DECODER_FIRST_ACCESS_UNIT) |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
239 libschroedinger_handle_first_access_unit(avccontext); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
240 go = 1; |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
241 } else |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
242 outer = 0; |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
243 format = p_schro_params->format; |
6738 | 244 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
245 while (go) { |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
246 /* Parse data and process result. */ |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
247 state = schro_decoder_wait(decoder); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
248 switch (state) { |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
249 case SCHRO_DECODER_FIRST_ACCESS_UNIT: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
250 libschroedinger_handle_first_access_unit(avccontext); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
251 break; |
6738 | 252 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
253 case SCHRO_DECODER_NEED_BITS: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
254 /* Need more input data - stop iterating over what we have. */ |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
255 go = 0; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
256 break; |
6738 | 257 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
258 case SCHRO_DECODER_NEED_FRAME: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
259 /* Decoder needs a frame - create one and push it in. */ |
10061
09f2db2d7c90
Fix bug caused by difference in stride and picture width.
diego
parents:
10060
diff
changeset
|
260 frame = ff_create_schro_frame(avccontext, |
09f2db2d7c90
Fix bug caused by difference in stride and picture width.
diego
parents:
10060
diff
changeset
|
261 p_schro_params->frame_format); |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
262 schro_decoder_add_output_picture(decoder, frame); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
263 break; |
6738 | 264 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
265 case SCHRO_DECODER_OK: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
266 /* Pull a frame out of the decoder. */ |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
267 frame = schro_decoder_pull(decoder); |
6738 | 268 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
269 if (frame) |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
270 ff_dirac_schro_queue_push_back(&p_schro_params->dec_frame_queue, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
271 frame); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
272 break; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
273 case SCHRO_DECODER_EOS: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
274 go = 0; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
275 p_schro_params->eos_pulled = 1; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
276 schro_decoder_reset(decoder); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
277 outer = 0; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
278 break; |
6738 | 279 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
280 case SCHRO_DECODER_ERROR: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
281 return -1; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
282 break; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
283 } |
6738 | 284 } |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
285 } while (outer); |
6738 | 286 |
287 /* Grab next frame to be returned from the top of the queue. */ | |
288 frame = ff_dirac_schro_queue_pop(&p_schro_params->dec_frame_queue); | |
289 | |
10055 | 290 if (frame) { |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
291 memcpy(p_schro_params->dec_pic.data[0], |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
292 frame->components[0].data, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
293 frame->components[0].length); |
6738 | 294 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
295 memcpy(p_schro_params->dec_pic.data[1], |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
296 frame->components[1].data, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
297 frame->components[1].length); |
6738 | 298 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
299 memcpy(p_schro_params->dec_pic.data[2], |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
300 frame->components[2].data, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
301 frame->components[2].length); |
6738 | 302 |
303 /* Fill picture with current buffer data from Schroedinger. */ | |
304 avpicture_fill(picture, p_schro_params->dec_pic.data[0], | |
305 avccontext->pix_fmt, | |
306 avccontext->width, avccontext->height); | |
307 | |
308 *data_size = sizeof(AVPicture); | |
309 | |
310 /* Now free the frame resources. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
311 libschroedinger_decode_frame_free(frame); |
6738 | 312 } |
313 return buf_size; | |
314 } | |
315 | |
316 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
317 static av_cold int libschroedinger_decode_close(AVCodecContext *avccontext) |
6738 | 318 { |
319 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
320 /* Free the decoder. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
321 schro_decoder_free(p_schro_params->decoder); |
6738 | 322 av_freep(&p_schro_params->format); |
323 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
324 avpicture_free(&p_schro_params->dec_pic); |
6738 | 325 |
326 /* Free data in the output frame queue. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
327 ff_dirac_schro_queue_free(&p_schro_params->dec_frame_queue, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
328 libschroedinger_decode_frame_free); |
6738 | 329 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
330 return 0; |
6738 | 331 } |
332 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
333 static void libschroedinger_flush(AVCodecContext *avccontext) |
6738 | 334 { |
335 /* Got a seek request. Free the decoded frames queue and then reset | |
336 * the decoder */ | |
337 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
338 | |
339 /* Free data in the output frame queue. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
340 ff_dirac_schro_queue_free(&p_schro_params->dec_frame_queue, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
341 libschroedinger_decode_frame_free); |
6738 | 342 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
343 ff_dirac_schro_queue_init(&p_schro_params->dec_frame_queue); |
6738 | 344 schro_decoder_reset(p_schro_params->decoder); |
345 p_schro_params->eos_pulled = 0; | |
346 p_schro_params->eos_signalled = 0; | |
347 } | |
348 | |
349 AVCodec libschroedinger_decoder = { | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
350 "libschroedinger", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10061
diff
changeset
|
351 AVMEDIA_TYPE_VIDEO, |
6738 | 352 CODEC_ID_DIRAC, |
353 sizeof(FfmpegSchroDecoderParams), | |
354 libschroedinger_decode_init, | |
355 NULL, | |
356 libschroedinger_decode_close, | |
357 libschroedinger_decode_frame, | |
358 CODEC_CAP_DELAY, | |
6819
43bede126ef6
missing codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6757
diff
changeset
|
359 .flush = libschroedinger_flush, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6819
diff
changeset
|
360 .long_name = NULL_IF_CONFIG_SMALL("libschroedinger Dirac 2.2"), |
6738 | 361 }; |