Mercurial > libavcodec.hg
annotate libschroedingerdec.c @ 11601:29fda2500178 libavcodec
Avoid the use of the symbol ff_expr_s for referencing AVExpr.
This way we have to deal only with struct AVExpr and AVExpr, which is
slightly less confusing as the association between the two symbols is
obvious.
author | stefano |
---|---|
date | Sun, 11 Apr 2010 18:44:51 +0000 |
parents | 8a4984c5cacc |
children | 7dd2a45249a9 |
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 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8422
diff
changeset
|
23 * @file libavcodec/libschroedingerdec.c |
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 | |
30 #include "avcodec.h" | |
31 #include "libdirac_libschro.h" | |
32 #include "libschroedinger.h" | |
33 | |
34 #undef NDEBUG | |
35 #include <assert.h> | |
36 | |
37 | |
38 #include <schroedinger/schro.h> | |
39 #include <schroedinger/schrodebug.h> | |
40 #include <schroedinger/schrovideoformat.h> | |
41 | |
42 /** libschroedinger decoder private data */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
43 typedef struct FfmpegSchroDecoderParams { |
6738 | 44 /** Schroedinger video format */ |
45 SchroVideoFormat *format; | |
46 | |
47 /** Schroedinger frame format */ | |
48 SchroFrameFormat frame_format; | |
49 | |
50 /** decoder handle */ | |
51 SchroDecoder* decoder; | |
52 | |
53 /** queue storing decoded frames */ | |
54 FfmpegDiracSchroQueue dec_frame_queue; | |
55 | |
56 /** end of sequence signalled */ | |
57 int eos_signalled; | |
58 | |
59 /** end of sequence pulled */ | |
60 int eos_pulled; | |
61 | |
62 /** decoded picture */ | |
63 AVPicture dec_pic; | |
64 } FfmpegSchroDecoderParams; | |
65 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
66 typedef struct FfmpegSchroParseUnitContext { |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
67 const uint8_t *buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
68 int buf_size; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
69 } FfmpegSchroParseUnitContext; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
70 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
71 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
72 static void libschroedinger_decode_buffer_free(SchroBuffer *schro_buf, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
73 void *priv); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
74 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
75 static void FfmpegSchroParseContextInit(FfmpegSchroParseUnitContext *parse_ctx, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
76 const uint8_t *buf, int buf_size) |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
77 { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
78 parse_ctx->buf = buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
79 parse_ctx->buf_size = buf_size; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
80 } |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
81 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
82 static SchroBuffer* FfmpegFindNextSchroParseUnit(FfmpegSchroParseUnitContext *parse_ctx) |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
83 { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
84 SchroBuffer *enc_buf = NULL; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
85 int next_pu_offset = 0; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
86 unsigned char *in_buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
87 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
88 if (parse_ctx->buf_size < 13 || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
89 parse_ctx->buf[0] != 'B' || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
90 parse_ctx->buf[1] != 'B' || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
91 parse_ctx->buf[2] != 'C' || |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
92 parse_ctx->buf[3] != 'D') |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
93 return NULL; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
94 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
95 next_pu_offset = (parse_ctx->buf[5] << 24) + |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
96 (parse_ctx->buf[6] << 16) + |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
97 (parse_ctx->buf[7] << 8) + |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
98 parse_ctx->buf[8]; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
99 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
100 if (next_pu_offset == 0 && |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
101 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
|
102 next_pu_offset = 13; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
103 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
104 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
|
105 return NULL; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
106 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
107 in_buf = av_malloc(next_pu_offset); |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
108 memcpy(in_buf, parse_ctx->buf, next_pu_offset); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
109 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
|
110 enc_buf->free = libschroedinger_decode_buffer_free; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
111 enc_buf->priv = in_buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
112 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
113 parse_ctx->buf += next_pu_offset; |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
114 parse_ctx->buf_size -= next_pu_offset; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
115 |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
116 return enc_buf; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
117 } |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
118 |
6738 | 119 /** |
120 * Returns FFmpeg chroma format. | |
121 */ | |
122 static enum PixelFormat GetFfmpegChromaFormat(SchroChromaFormat schro_pix_fmt) | |
123 { | |
124 int num_formats = sizeof(ffmpeg_schro_pixel_format_map) / | |
125 sizeof(ffmpeg_schro_pixel_format_map[0]); | |
126 int idx; | |
127 | |
10056
646065f63290
Remove useless braces around if/for/while expressions.
diego
parents:
10055
diff
changeset
|
128 for (idx = 0; idx < num_formats; ++idx) |
646065f63290
Remove useless braces around if/for/while expressions.
diego
parents:
10055
diff
changeset
|
129 if (ffmpeg_schro_pixel_format_map[idx].schro_pix_fmt == schro_pix_fmt) |
6738 | 130 return ffmpeg_schro_pixel_format_map[idx].ff_pix_fmt; |
131 return PIX_FMT_NONE; | |
132 } | |
133 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
134 static av_cold int libschroedinger_decode_init(AVCodecContext *avccontext) |
6738 | 135 { |
136 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
137 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; |
6738 | 138 /* First of all, initialize our supporting libraries. */ |
139 schro_init(); | |
140 | |
141 schro_debug_set_level(avccontext->debug); | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
142 p_schro_params->decoder = schro_decoder_new(); |
6738 | 143 schro_decoder_set_skip_ratio(p_schro_params->decoder, 1); |
144 | |
145 if (!p_schro_params->decoder) | |
146 return -1; | |
147 | |
148 /* Initialize the decoded frame queue. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
149 ff_dirac_schro_queue_init(&p_schro_params->dec_frame_queue); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
150 return 0; |
6738 | 151 } |
152 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
153 static void libschroedinger_decode_buffer_free(SchroBuffer *schro_buf, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
154 void *priv) |
6738 | 155 { |
156 av_freep(&priv); | |
157 } | |
158 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
159 static void libschroedinger_decode_frame_free(void *frame) |
6738 | 160 { |
161 schro_frame_unref(frame); | |
162 } | |
163 | |
164 static void libschroedinger_handle_first_access_unit(AVCodecContext *avccontext) | |
165 { | |
166 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
167 SchroDecoder *decoder = p_schro_params->decoder; | |
168 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
169 p_schro_params->format = schro_decoder_get_video_format(decoder); |
6738 | 170 |
171 /* Tell FFmpeg about sequence details. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
172 if (avcodec_check_dimensions(avccontext, p_schro_params->format->width, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
173 p_schro_params->format->height) < 0) { |
6738 | 174 av_log(avccontext, AV_LOG_ERROR, "invalid dimensions (%dx%d)\n", |
175 p_schro_params->format->width, p_schro_params->format->height); | |
176 avccontext->height = avccontext->width = 0; | |
6754 | 177 return; |
6738 | 178 } |
179 avccontext->height = p_schro_params->format->height; | |
180 avccontext->width = p_schro_params->format->width; | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
181 avccontext->pix_fmt = GetFfmpegChromaFormat(p_schro_params->format->chroma_format); |
6738 | 182 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
183 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
|
184 &p_schro_params->frame_format) == -1) { |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
185 av_log(avccontext, AV_LOG_ERROR, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
186 "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
|
187 "and 4:4:4 formats.\n"); |
6754 | 188 return; |
6738 | 189 } |
190 | |
191 avccontext->time_base.den = p_schro_params->format->frame_rate_numerator; | |
192 avccontext->time_base.num = p_schro_params->format->frame_rate_denominator; | |
193 | |
10055 | 194 if (!p_schro_params->dec_pic.data[0]) |
6738 | 195 avpicture_alloc(&p_schro_params->dec_pic, |
196 avccontext->pix_fmt, | |
197 avccontext->width, | |
198 avccontext->height); | |
199 } | |
200 | |
201 static int libschroedinger_decode_frame(AVCodecContext *avccontext, | |
202 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
203 AVPacket *avpkt) |
6738 | 204 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
205 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
206 int buf_size = avpkt->size; |
6738 | 207 |
208 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
209 SchroDecoder *decoder = p_schro_params->decoder; | |
210 SchroVideoFormat *format; | |
211 AVPicture *picture = data; | |
212 SchroBuffer *enc_buf; | |
213 SchroFrame* frame; | |
214 int state; | |
215 int go = 1; | |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
216 int outer = 1; |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
217 FfmpegSchroParseUnitContext parse_ctx; |
6738 | 218 |
219 *data_size = 0; | |
220 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
221 FfmpegSchroParseContextInit(&parse_ctx, buf, buf_size); |
10055 | 222 if (!buf_size) { |
6738 | 223 if (!p_schro_params->eos_signalled) { |
224 state = schro_decoder_push_end_of_stream(decoder); | |
225 p_schro_params->eos_signalled = 1; | |
226 } | |
227 } | |
228 | |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
229 /* 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
|
230 do { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
231 if ((enc_buf = FfmpegFindNextSchroParseUnit(&parse_ctx))) { |
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
232 /* Push buffer into decoder. */ |
8422
e623323d409f
Fix incorrectly constructed Dirac parse units that caused A/V sync loss.
diego
parents:
7234
diff
changeset
|
233 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
|
234 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
|
235 avccontext->has_b_frames = 1; |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
236 state = schro_decoder_push(decoder, enc_buf); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
237 if (state == SCHRO_DECODER_FIRST_ACCESS_UNIT) |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
238 libschroedinger_handle_first_access_unit(avccontext); |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
239 go = 1; |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
240 } else |
7234
dea986389c57
Parse frames to feed the decoder with individual parse units.
benoit
parents:
7040
diff
changeset
|
241 outer = 0; |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
242 format = p_schro_params->format; |
6738 | 243 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
244 while (go) { |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
245 /* Parse data and process result. */ |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
246 state = schro_decoder_wait(decoder); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
247 switch (state) { |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
248 case SCHRO_DECODER_FIRST_ACCESS_UNIT: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
249 libschroedinger_handle_first_access_unit(avccontext); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
250 break; |
6738 | 251 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
252 case SCHRO_DECODER_NEED_BITS: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
253 /* Need more input data - stop iterating over what we have. */ |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
254 go = 0; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
255 break; |
6738 | 256 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
257 case SCHRO_DECODER_NEED_FRAME: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
258 /* 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
|
259 frame = ff_create_schro_frame(avccontext, |
09f2db2d7c90
Fix bug caused by difference in stride and picture width.
diego
parents:
10060
diff
changeset
|
260 p_schro_params->frame_format); |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
261 schro_decoder_add_output_picture(decoder, frame); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
262 break; |
6738 | 263 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
264 case SCHRO_DECODER_OK: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
265 /* Pull a frame out of the decoder. */ |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
266 frame = schro_decoder_pull(decoder); |
6738 | 267 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
268 if (frame) |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
269 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
|
270 frame); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
271 break; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
272 case SCHRO_DECODER_EOS: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
273 go = 0; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
274 p_schro_params->eos_pulled = 1; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
275 schro_decoder_reset(decoder); |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
276 outer = 0; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
277 break; |
6738 | 278 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
279 case SCHRO_DECODER_ERROR: |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
280 return -1; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
281 break; |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
282 } |
6738 | 283 } |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
284 } while (outer); |
6738 | 285 |
286 /* Grab next frame to be returned from the top of the queue. */ | |
287 frame = ff_dirac_schro_queue_pop(&p_schro_params->dec_frame_queue); | |
288 | |
10055 | 289 if (frame) { |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
290 memcpy(p_schro_params->dec_pic.data[0], |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
291 frame->components[0].data, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
292 frame->components[0].length); |
6738 | 293 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
294 memcpy(p_schro_params->dec_pic.data[1], |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
295 frame->components[1].data, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
296 frame->components[1].length); |
6738 | 297 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
298 memcpy(p_schro_params->dec_pic.data[2], |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
299 frame->components[2].data, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
300 frame->components[2].length); |
6738 | 301 |
302 /* Fill picture with current buffer data from Schroedinger. */ | |
303 avpicture_fill(picture, p_schro_params->dec_pic.data[0], | |
304 avccontext->pix_fmt, | |
305 avccontext->width, avccontext->height); | |
306 | |
307 *data_size = sizeof(AVPicture); | |
308 | |
309 /* Now free the frame resources. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
310 libschroedinger_decode_frame_free(frame); |
6738 | 311 } |
312 return buf_size; | |
313 } | |
314 | |
315 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8718
diff
changeset
|
316 static av_cold int libschroedinger_decode_close(AVCodecContext *avccontext) |
6738 | 317 { |
318 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
319 /* Free the decoder. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
320 schro_decoder_free(p_schro_params->decoder); |
6738 | 321 av_freep(&p_schro_params->format); |
322 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
323 avpicture_free(&p_schro_params->dec_pic); |
6738 | 324 |
325 /* Free data in the output frame queue. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
326 ff_dirac_schro_queue_free(&p_schro_params->dec_frame_queue, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
327 libschroedinger_decode_frame_free); |
6738 | 328 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
329 return 0; |
6738 | 330 } |
331 | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
332 static void libschroedinger_flush(AVCodecContext *avccontext) |
6738 | 333 { |
334 /* Got a seek request. Free the decoded frames queue and then reset | |
335 * the decoder */ | |
336 FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data; | |
337 | |
338 /* Free data in the output frame queue. */ | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
339 ff_dirac_schro_queue_free(&p_schro_params->dec_frame_queue, |
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
340 libschroedinger_decode_frame_free); |
6738 | 341 |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
342 ff_dirac_schro_queue_init(&p_schro_params->dec_frame_queue); |
6738 | 343 schro_decoder_reset(p_schro_params->decoder); |
344 p_schro_params->eos_pulled = 0; | |
345 p_schro_params->eos_signalled = 0; | |
346 } | |
347 | |
348 AVCodec libschroedinger_decoder = { | |
10060
965220ebc611
cosmetics: indentation, prettyprinting, K&R coding style
diego
parents:
10056
diff
changeset
|
349 "libschroedinger", |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10061
diff
changeset
|
350 AVMEDIA_TYPE_VIDEO, |
6738 | 351 CODEC_ID_DIRAC, |
352 sizeof(FfmpegSchroDecoderParams), | |
353 libschroedinger_decode_init, | |
354 NULL, | |
355 libschroedinger_decode_close, | |
356 libschroedinger_decode_frame, | |
357 CODEC_CAP_DELAY, | |
6819
43bede126ef6
missing codec long names by Stefano Sabatini, stefano.sabatini-lala poste it
diego
parents:
6757
diff
changeset
|
358 .flush = libschroedinger_flush, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6819
diff
changeset
|
359 .long_name = NULL_IF_CONFIG_SMALL("libschroedinger Dirac 2.2"), |
6738 | 360 }; |