annotate libtheoraenc.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 043574c5c153
children d9f8496b3b91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
1 /*
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
2 * Copyright (c) 2006 Paul Richards <paul.richards@gmail.com>
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
3 *
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
4 * This file is part of FFmpeg.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
5 *
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
10 *
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
14 * Lesser General Public License for more details.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
15 *
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 5089
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
19 */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
20
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
21 /*!
8673
5b7d5a33a3e2 Fix filenames in Doxygen comments.
diego
parents: 8574
diff changeset
22 * \file libtheoraenc.c
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
23 * \brief Theora encoder using libtheora.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
24 * \author Paul Richards <paul.richards@gmail.com>
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
25 *
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
26 * A lot of this is copy / paste from other output codecs in
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
27 * libavcodec or pure guesswork (or both).
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
28 *
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
29 * I have used t_ prefixes on variables which are libtheora types
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
30 * and o_ prefixes on variables which are libogg types.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
31 */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
32
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
33 /* FFmpeg includes */
8574
d679fd3a5359 Add missing inclusion of libavutil/intreadwrite.h, fix compilation when
stefano
parents: 7040
diff changeset
34 #include "libavutil/intreadwrite.h"
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6712
diff changeset
35 #include "libavutil/log.h"
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
36 #include "avcodec.h"
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
37
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
38 /* libtheora includes */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
39 #include <theora/theora.h>
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
40
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
41 typedef struct TheoraContext{
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
42 theora_state t_state;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
43 } TheoraContext;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
44
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
45 /*!
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
46 Concatenates an ogg_packet into the extradata.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
47 */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
48 static int concatenate_packet(unsigned int* offset, AVCodecContext* avc_context, const ogg_packet* packet)
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
49 {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
50 char* message = NULL;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
51 uint8_t* newdata = NULL;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
52 int newsize = avc_context->extradata_size + 2 + packet->bytes;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
53
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
54 if (packet->bytes < 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
55 message = "ogg_packet has negative size";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
56 } else if (packet->bytes > 0xffff) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
57 message = "ogg_packet is larger than 65535 bytes";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
58 } else if (newsize < avc_context->extradata_size) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
59 message = "extradata_size would overflow";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
60 } else {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
61 newdata = av_realloc(avc_context->extradata, newsize);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
62 if (newdata == NULL) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
63 message = "av_realloc failed";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
64 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
65 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
66 if (message != NULL) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
67 av_log(avc_context, AV_LOG_ERROR, "concatenate_packet failed: %s\n", message);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
68 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
69 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
70
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
71 avc_context->extradata = newdata;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
72 avc_context->extradata_size = newsize;
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4496
diff changeset
73 AV_WB16(avc_context->extradata + (*offset), packet->bytes);
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4496
diff changeset
74 *offset += 2;
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
75 memcpy( avc_context->extradata + (*offset), packet->packet, packet->bytes );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
76 (*offset) += packet->bytes;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
77 return 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
78 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
79
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8673
diff changeset
80 static av_cold int encode_init(AVCodecContext* avc_context)
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
81 {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
82 theora_info t_info;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
83 theora_comment t_comment;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
84 ogg_packet o_packet;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
85 unsigned int offset;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
86 TheoraContext *h = avc_context->priv_data;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
87
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
88 /* Set up the theora_info struct */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
89 theora_info_init( &t_info );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
90 t_info.width = avc_context->width;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
91 t_info.height = avc_context->height;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
92 t_info.frame_width = avc_context->width;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
93 t_info.frame_height = avc_context->height;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
94 t_info.offset_x = 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
95 t_info.offset_y = 0;
4496
a02a0d06e99b Add a comment about swapped numerator and denominator.
diego
parents: 4403
diff changeset
96 /* Swap numerator and denominator as time_base in AVCodecContext gives the
a02a0d06e99b Add a comment about swapped numerator and denominator.
diego
parents: 4403
diff changeset
97 * time period between frames, but theora_info needs the framerate. */
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
98 t_info.fps_numerator = avc_context->time_base.den;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
99 t_info.fps_denominator = avc_context->time_base.num;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
100 if (avc_context->sample_aspect_ratio.num != 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
101 t_info.aspect_numerator = avc_context->sample_aspect_ratio.num;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
102 t_info.aspect_denominator = avc_context->sample_aspect_ratio.den;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
103 } else {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
104 t_info.aspect_numerator = 1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
105 t_info.aspect_denominator = 1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
106 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
107 t_info.colorspace = OC_CS_UNSPECIFIED;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
108 t_info.pixelformat = OC_PF_420;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
109 t_info.target_bitrate = avc_context->bit_rate;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
110 t_info.keyframe_frequency = avc_context->gop_size;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
111 t_info.keyframe_frequency_force = avc_context->gop_size;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
112 t_info.keyframe_mindistance = avc_context->keyint_min;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
113 t_info.quality = 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
114
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
115 t_info.quick_p = 1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
116 t_info.dropframes_p = 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
117 t_info.keyframe_auto_p = 1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
118 t_info.keyframe_data_target_bitrate = t_info.target_bitrate * 1.5;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
119 t_info.keyframe_auto_threshold = 80;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
120 t_info.noise_sensitivity = 1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
121 t_info.sharpness = 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
122
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
123 /* Now initialise libtheora */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
124 if (theora_encode_init( &(h->t_state), &t_info ) != 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
125 av_log(avc_context, AV_LOG_ERROR, "theora_encode_init failed\n");
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
126 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
127 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
128
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
129 /* Clear up theora_info struct */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
130 theora_info_clear( &t_info );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
131
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
132 /*
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
133 Output first header packet consisting of theora
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
134 header, comment, and tables.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
135
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
136 Each one is prefixed with a 16bit size, then they
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
137 are concatenated together into ffmpeg's extradata.
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
138 */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
139 offset = 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
140
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
141 /* Header */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
142 theora_encode_header( &(h->t_state), &o_packet );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
143 if (concatenate_packet( &offset, avc_context, &o_packet ) != 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
144 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
145 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
146
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
147 /* Comment */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
148 theora_comment_init( &t_comment );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
149 theora_encode_comment( &t_comment, &o_packet );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
150 if (concatenate_packet( &offset, avc_context, &o_packet ) != 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
151 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
152 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
153
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
154 /* Tables */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
155 theora_encode_tables( &(h->t_state), &o_packet );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
156 if (concatenate_packet( &offset, avc_context, &o_packet ) != 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
157 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
158 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
159
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
160 /* Clear up theora_comment struct */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
161 theora_comment_clear( &t_comment );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
162
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
163 /* Set up the output AVFrame */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
164 avc_context->coded_frame= avcodec_alloc_frame();
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
165
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
166 return 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
167 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
168
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
169 static int encode_frame(
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
170 AVCodecContext* avc_context,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
171 uint8_t *outbuf,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
172 int buf_size,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
173 void *data)
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
174 {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
175 yuv_buffer t_yuv_buffer;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
176 TheoraContext *h = avc_context->priv_data;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
177 AVFrame *frame = data;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
178 ogg_packet o_packet;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
179 int result;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
180
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
181 assert(avc_context->pix_fmt == PIX_FMT_YUV420P);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
182
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
183 /* Copy planes to the theora yuv_buffer */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
184 if (frame->linesize[1] != frame->linesize[2]) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
185 av_log(avc_context, AV_LOG_ERROR, "U and V stride differ\n");
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
186 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
187 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
188
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
189 t_yuv_buffer.y_width = avc_context->width;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
190 t_yuv_buffer.y_height = avc_context->height;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
191 t_yuv_buffer.y_stride = frame->linesize[0];
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
192 t_yuv_buffer.uv_width = t_yuv_buffer.y_width / 2;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
193 t_yuv_buffer.uv_height = t_yuv_buffer.y_height / 2;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
194 t_yuv_buffer.uv_stride = frame->linesize[1];
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
195
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
196 t_yuv_buffer.y = frame->data[0];
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
197 t_yuv_buffer.u = frame->data[1];
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
198 t_yuv_buffer.v = frame->data[2];
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
199
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
200 /* Now call into theora_encode_YUVin */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
201 result = theora_encode_YUVin( &(h->t_state), &t_yuv_buffer );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
202 if (result != 0) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
203 const char* message;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
204 switch (result) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
205 case -1:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
206 message = "differing frame sizes";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
207 break;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
208 case OC_EINVAL:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
209 message = "encoder is not ready or is finished";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
210 break;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
211 default:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
212 message = "unknown reason";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
213 break;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
214 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
215 av_log(avc_context, AV_LOG_ERROR, "theora_encode_YUVin failed (%s) [%d]\n", message, result);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
216 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
217 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
218
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
219 /* Pick up returned ogg_packet */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
220 result = theora_encode_packetout( &(h->t_state), 0, &o_packet );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
221 switch (result) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
222 case 0:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
223 /* No packet is ready */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
224 return 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
225 case 1:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
226 /* Success, we have a packet */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
227 break;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
228 default:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
229 av_log(avc_context, AV_LOG_ERROR, "theora_encode_packetout failed [%d]\n", result);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
230 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
231 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
232
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
233 /* Copy ogg_packet content out to buffer */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
234 if (buf_size < o_packet.bytes) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
235 av_log(avc_context, AV_LOG_ERROR, "encoded frame too large\n");
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
236 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
237 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
238 memcpy(outbuf, o_packet.packet, o_packet.bytes);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
239
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
240 return o_packet.bytes;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
241 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
242
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8673
diff changeset
243 static av_cold int encode_close(AVCodecContext* avc_context)
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
244 {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
245 ogg_packet o_packet;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
246 TheoraContext *h = avc_context->priv_data;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
247 int result;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
248 const char* message;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
249
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
250 result = theora_encode_packetout( &(h->t_state), 1, &o_packet );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
251 theora_clear( &(h->t_state) );
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
252 switch (result) {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
253 case 0:/* No packet is ready */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
254 case -1:/* Encoding finished */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
255 return 0;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
256 case 1:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
257 /* We have a packet */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
258 message = "gave us a packet";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
259 break;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
260 default:
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
261 message = "unknown reason";
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
262 break;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
263 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
264 av_log(avc_context, AV_LOG_ERROR, "theora_encode_packetout failed (%s) [%d]\n", message, result);
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
265 return -1;
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
266 }
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
267
6788
e1302edb0f69 Replace some occurrences of -1 with PIX_FMT_NONE.
cehoyos
parents: 6763
diff changeset
268 static const enum PixelFormat supported_pixel_formats[] = { PIX_FMT_YUV420P, PIX_FMT_NONE };
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
269
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
270 /*! AVCodec struct exposed to libavcodec */
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
271 AVCodec libtheora_encoder =
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
272 {
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
273 .name = "libtheora",
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
274 .type = CODEC_TYPE_VIDEO,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
275 .id = CODEC_ID_THEORA,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
276 .priv_data_size = sizeof(TheoraContext),
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
277 .init = encode_init,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
278 .close = encode_close,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
279 .encode = encode_frame,
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
280 .pix_fmts = supported_pixel_formats,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6788
diff changeset
281 .long_name = NULL_IF_CONFIG_SMALL("libtheora Theora"),
4403
432d332b7def Theora encoding via libtheora.
diego
parents:
diff changeset
282 };