annotate libschroedingerenc.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents d3098fb8ec05
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
1 /*
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
2 * Dirac encoder support via Schroedinger libraries
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
3 * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com >
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
4 *
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
6 *
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
11 *
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
16 *
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
20 */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
21
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
24 * Dirac encoder support via libschroedinger-1.0 libraries. More details about
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
25 * the Schroedinger project can be found at http://www.diracvideo.org/.
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
26 * The library implements Dirac Specification Version 2.2
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
27 * (http://dirac.sourceforge.net/specification.html).
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
28 */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
29
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
30 #undef NDEBUG
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
31 #include <assert.h>
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
32
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
33 #include <schroedinger/schro.h>
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
34 #include <schroedinger/schrodebug.h>
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
35 #include <schroedinger/schrovideoformat.h>
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
36
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
37 #include "avcodec.h"
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
38 #include "libdirac_libschro.h"
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
39 #include "libschroedinger.h"
11684
b4aff04c10cf schroenc: Use AV_RB32
conrad
parents: 11683
diff changeset
40 #include "bytestream.h"
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
41
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
42
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
43 /** libschroedinger encoder private data */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
44 typedef struct FfmpegSchroEncoderParams {
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
45 /** Schroedinger video format */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
46 SchroVideoFormat *format;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
47
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
48 /** Schroedinger frame format */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
49 SchroFrameFormat frame_format;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
50
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
51 /** frame being encoded */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
52 AVFrame picture;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
53
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
54 /** frame size */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
55 int frame_size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
56
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
57 /** Schroedinger encoder handle*/
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
58 SchroEncoder* encoder;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
59
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
60 /** buffer to store encoder output before writing it to the frame queue*/
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
61 unsigned char *enc_buf;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
62
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
63 /** Size of encoder buffer*/
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
64 int enc_buf_size;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
65
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
66 /** queue storing encoded frames */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
67 FfmpegDiracSchroQueue enc_frame_queue;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
68
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
69 /** end of sequence signalled */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
70 int eos_signalled;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
71
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
72 /** end of sequence pulled */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
73 int eos_pulled;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
74 } FfmpegSchroEncoderParams;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
75
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
76 /**
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
77 * Works out Schro-compatible chroma format.
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
78 */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
79 static int SetSchroChromaFormat(AVCodecContext *avccontext)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
80 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
81 int num_formats = sizeof(ffmpeg_schro_pixel_format_map) /
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
82 sizeof(ffmpeg_schro_pixel_format_map[0]);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
83 int idx;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
84
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
85 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
86
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
87 for (idx = 0; idx < num_formats; ++idx) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
88 if (ffmpeg_schro_pixel_format_map[idx].ff_pix_fmt ==
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
89 avccontext->pix_fmt) {
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
90 p_schro_params->format->chroma_format =
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
91 ffmpeg_schro_pixel_format_map[idx].schro_pix_fmt;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
92 return 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
93 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
94 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
95
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
96 av_log(avccontext, AV_LOG_ERROR,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
97 "This codec currently only supports planar YUV 4:2:0, 4:2:2"
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
98 " and 4:4:4 formats.\n");
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
99
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
100 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
101 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
102
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
103 static int libschroedinger_encode_init(AVCodecContext *avccontext)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
104 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
105 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
106 SchroVideoFormatEnum preset;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
107
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
108 /* Initialize the libraries that libschroedinger depends on. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
109 schro_init();
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
110
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
111 /* Create an encoder object. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
112 p_schro_params->encoder = schro_encoder_new();
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
113
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
114 if (!p_schro_params->encoder) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
115 av_log(avccontext, AV_LOG_ERROR,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
116 "Unrecoverable Error: schro_encoder_new failed. ");
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
117 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
118 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
119
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
120 /* Initialize the format. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
121 preset = ff_get_schro_video_format_preset(avccontext);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
122 p_schro_params->format =
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
123 schro_encoder_get_video_format(p_schro_params->encoder);
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
124 schro_video_format_set_std_video_format(p_schro_params->format, preset);
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
125 p_schro_params->format->width = avccontext->width;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
126 p_schro_params->format->height = avccontext->height;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
127
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
128 if (SetSchroChromaFormat(avccontext) == -1)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
129 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
130
11685
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
131 if (avccontext->color_primaries == AVCOL_PRI_BT709) {
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
132 p_schro_params->format->colour_primaries = SCHRO_COLOUR_PRIMARY_HDTV;
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
133 } else if (avccontext->color_primaries == AVCOL_PRI_BT470BG) {
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
134 p_schro_params->format->colour_primaries = SCHRO_COLOUR_PRIMARY_SDTV_625;
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
135 } else if (avccontext->color_primaries == AVCOL_PRI_SMPTE170M) {
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
136 p_schro_params->format->colour_primaries = SCHRO_COLOUR_PRIMARY_SDTV_525;
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
137 }
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
138
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
139 if (avccontext->colorspace == AVCOL_SPC_BT709) {
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
140 p_schro_params->format->colour_matrix = SCHRO_COLOUR_MATRIX_HDTV;
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
141 } else if (avccontext->colorspace == AVCOL_SPC_BT470BG) {
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
142 p_schro_params->format->colour_matrix = SCHRO_COLOUR_MATRIX_SDTV;
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
143 }
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
144
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
145 if (avccontext->color_trc == AVCOL_TRC_BT709) {
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
146 p_schro_params->format->transfer_function = SCHRO_TRANSFER_CHAR_TV_GAMMA;
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
147 }
d3098fb8ec05 schroenc: Set colorspace info
conrad
parents: 11684
diff changeset
148
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
149 if (ff_get_schro_frame_format(p_schro_params->format->chroma_format,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
150 &p_schro_params->frame_format) == -1) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
151 av_log(avccontext, AV_LOG_ERROR,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
152 "This codec currently supports only planar YUV 4:2:0, 4:2:2"
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
153 " and 4:4:4 formats.\n");
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
154 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
155 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
156
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
157 p_schro_params->format->frame_rate_numerator = avccontext->time_base.den;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
158 p_schro_params->format->frame_rate_denominator = avccontext->time_base.num;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
159
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
160 p_schro_params->frame_size = avpicture_get_size(avccontext->pix_fmt,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
161 avccontext->width,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
162 avccontext->height);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
163
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
164 avccontext->coded_frame = &p_schro_params->picture;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
165
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 8790
diff changeset
166 if (!avccontext->gop_size) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
167 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
168 "gop_structure",
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
169 SCHRO_ENCODER_GOP_INTRA_ONLY);
7839
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7253
diff changeset
170
10056
646065f63290 Remove useless braces around if/for/while expressions.
diego
parents: 10055
diff changeset
171 if (avccontext->coder_type == FF_CODER_TYPE_VLC)
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
172 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
173 "enable_noarith", 1);
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
174 } else {
11682
5173cc26d42f schroenc: Set keyframe interval
conrad
parents: 11681
diff changeset
175 schro_encoder_setting_set_double(p_schro_params->encoder,
5173cc26d42f schroenc: Set keyframe interval
conrad
parents: 11681
diff changeset
176 "au_distance", avccontext->gop_size);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
177 avccontext->has_b_frames = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
178 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
179
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
180 /* FIXME - Need to handle SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
181 if (avccontext->flags & CODEC_FLAG_QSCALE) {
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 8790
diff changeset
182 if (!avccontext->global_quality) {
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
183 /* lossless coding */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
184 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
185 "rate_control",
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
186 SCHRO_ENCODER_RATE_CONTROL_LOSSLESS);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
187 } else {
11681
04c086666e50 schroenc: Use constant quality for constant quality, not noise threshold
conrad
parents: 11680
diff changeset
188 int quality;
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
189 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
190 "rate_control",
11681
04c086666e50 schroenc: Use constant quality for constant quality, not noise threshold
conrad
parents: 11680
diff changeset
191 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_QUALITY);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
192
11681
04c086666e50 schroenc: Use constant quality for constant quality, not noise threshold
conrad
parents: 11680
diff changeset
193 quality = avccontext->global_quality / FF_QP2LAMBDA;
04c086666e50 schroenc: Use constant quality for constant quality, not noise threshold
conrad
parents: 11680
diff changeset
194 if (quality > 10)
04c086666e50 schroenc: Use constant quality for constant quality, not noise threshold
conrad
parents: 11680
diff changeset
195 quality = 10;
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
196 schro_encoder_setting_set_double(p_schro_params->encoder,
11681
04c086666e50 schroenc: Use constant quality for constant quality, not noise threshold
conrad
parents: 11680
diff changeset
197 "quality", quality);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
198 }
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
199 } else {
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
200 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
201 "rate_control",
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
202 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
203
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
204 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
205 "bitrate",
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
206 avccontext->bit_rate);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
207
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
208 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
209
10056
646065f63290 Remove useless braces around if/for/while expressions.
diego
parents: 10055
diff changeset
210 if (avccontext->flags & CODEC_FLAG_INTERLACED_ME)
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
211 /* All material can be coded as interlaced or progressive
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
212 irrespective of the type of source material. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
213 schro_encoder_setting_set_double(p_schro_params->encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
214 "interlaced_coding", 1);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
215
11683
83d14d771e80 schroenc: Set open-gop
conrad
parents: 11682
diff changeset
216 schro_encoder_setting_set_double(p_schro_params->encoder, "open_gop",
83d14d771e80 schroenc: Set open-gop
conrad
parents: 11682
diff changeset
217 !(avccontext->flags & CODEC_FLAG_CLOSED_GOP));
83d14d771e80 schroenc: Set open-gop
conrad
parents: 11682
diff changeset
218
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
219 /* FIXME: Signal range hardcoded to 8-bit data until both libschroedinger
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
220 * and libdirac support other bit-depth data. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
221 schro_video_format_set_std_signal_range(p_schro_params->format,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
222 SCHRO_SIGNAL_RANGE_8BIT_VIDEO);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
223
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
224 /* Set the encoder format. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
225 schro_encoder_set_video_format(p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
226 p_schro_params->format);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
227
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
228 /* Set the debug level. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
229 schro_debug_set_level(avccontext->debug);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
230
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
231 schro_encoder_start(p_schro_params->encoder);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
232
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
233 /* Initialize the encoded frame queue. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
234 ff_dirac_schro_queue_init(&p_schro_params->enc_frame_queue);
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
235 return 0;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
236 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
237
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
238 static SchroFrame *libschroedinger_frame_from_data(AVCodecContext *avccontext,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
239 void *in_data)
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
240 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
241 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
242 SchroFrame *in_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
243 /* Input line size may differ from what the codec supports. Especially
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
244 * when transcoding from one format to another. So use avpicture_layout
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
245 * to copy the frame. */
10061
09f2db2d7c90 Fix bug caused by difference in stride and picture width.
diego
parents: 10060
diff changeset
246 in_frame = ff_create_schro_frame(avccontext, p_schro_params->frame_format);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
247
10061
09f2db2d7c90 Fix bug caused by difference in stride and picture width.
diego
parents: 10060
diff changeset
248 if (in_frame)
09f2db2d7c90 Fix bug caused by difference in stride and picture width.
diego
parents: 10060
diff changeset
249 avpicture_layout((AVPicture *)in_data, avccontext->pix_fmt,
09f2db2d7c90 Fix bug caused by difference in stride and picture width.
diego
parents: 10060
diff changeset
250 avccontext->width, avccontext->height,
09f2db2d7c90 Fix bug caused by difference in stride and picture width.
diego
parents: 10060
diff changeset
251 in_frame->components[0].data,
09f2db2d7c90 Fix bug caused by difference in stride and picture width.
diego
parents: 10060
diff changeset
252 p_schro_params->frame_size);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
253
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
254 return in_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
255 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
256
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
257 static void SchroedingerFreeFrame(void *data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
258 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
259 FfmpegDiracSchroEncodedFrame *enc_frame = data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
260
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
261 av_freep(&(enc_frame->p_encbuf));
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
262 av_free(enc_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
263 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
264
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
265 static int libschroedinger_encode_frame(AVCodecContext *avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
266 unsigned char *frame,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
267 int buf_size, void *data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
268 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
269 int enc_size = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
270 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
271 SchroEncoder *encoder = p_schro_params->encoder;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
272 struct FfmpegDiracSchroEncodedFrame* p_frame_output = NULL;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
273 int go = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
274 SchroBuffer *enc_buf;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
275 int presentation_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
276 int parse_code;
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
277 int last_frame_in_sequence = 0;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
278
10058
d18468c5fee0 Simplify another 'if' condition: Replace 'exp == 0' by '!exp'.
diego
parents: 10056
diff changeset
279 if (!data) {
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
280 /* Push end of sequence if not already signalled. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
281 if (!p_schro_params->eos_signalled) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
282 schro_encoder_end_of_stream(encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
283 p_schro_params->eos_signalled = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
284 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
285 } else {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
286 /* Allocate frame data to schro input buffer. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
287 SchroFrame *in_frame = libschroedinger_frame_from_data(avccontext,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
288 data);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
289 /* Load next frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
290 schro_encoder_push_frame(encoder, in_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
291 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
292
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
293 if (p_schro_params->eos_pulled)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
294 go = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
295
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
296 /* Now check to see if we have any output from the encoder. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
297 while (go) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
298 SchroStateEnum state;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
299 state = schro_encoder_wait(encoder);
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
300 switch (state) {
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
301 case SCHRO_STATE_HAVE_BUFFER:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
302 case SCHRO_STATE_END_OF_STREAM:
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
303 enc_buf = schro_encoder_pull(encoder, &presentation_frame);
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
304 assert(enc_buf->length > 0);
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
305 assert(enc_buf->length <= buf_size);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
306 parse_code = enc_buf->data[4];
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
307
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
308 /* All non-frame data is prepended to actual frame data to
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
309 * be able to set the pts correctly. So we don't write data
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
310 * to the frame output queue until we actually have a frame
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
311 */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
312 p_schro_params->enc_buf = av_realloc(p_schro_params->enc_buf,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
313 p_schro_params->enc_buf_size + enc_buf->length);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
314
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
315 memcpy(p_schro_params->enc_buf + p_schro_params->enc_buf_size,
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
316 enc_buf->data, enc_buf->length);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
317 p_schro_params->enc_buf_size += enc_buf->length;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
318
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
319
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
320 if (state == SCHRO_STATE_END_OF_STREAM) {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
321 p_schro_params->eos_pulled = 1;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
322 go = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
323 }
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
324
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
325 if (!SCHRO_PARSE_CODE_IS_PICTURE(parse_code)) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
326 schro_buffer_unref(enc_buf);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
327 break;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
328 }
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
329
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
330 /* Create output frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
331 p_frame_output = av_mallocz(sizeof(FfmpegDiracSchroEncodedFrame));
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
332 /* Set output data. */
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
333 p_frame_output->size = p_schro_params->enc_buf_size;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
334 p_frame_output->p_encbuf = p_schro_params->enc_buf;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
335 if (SCHRO_PARSE_CODE_IS_INTRA(parse_code) &&
10056
646065f63290 Remove useless braces around if/for/while expressions.
diego
parents: 10055
diff changeset
336 SCHRO_PARSE_CODE_IS_REFERENCE(parse_code))
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
337 p_frame_output->key_frame = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
338
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
339 /* Parse the coded frame number from the bitstream. Bytes 14
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
340 * through 17 represesent the frame number. */
11684
b4aff04c10cf schroenc: Use AV_RB32
conrad
parents: 11683
diff changeset
341 p_frame_output->frame_num = AV_RB32(enc_buf->data + 13);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
342
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
343 ff_dirac_schro_queue_push_back(&p_schro_params->enc_frame_queue,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
344 p_frame_output);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
345 p_schro_params->enc_buf_size = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
346 p_schro_params->enc_buf = NULL;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
347
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
348 schro_buffer_unref(enc_buf);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
349
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
350 break;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
351
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
352 case SCHRO_STATE_NEED_FRAME:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
353 go = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
354 break;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
355
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
356 case SCHRO_STATE_AGAIN:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
357 break;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
358
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
359 default:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
360 av_log(avccontext, AV_LOG_ERROR, "Unknown Schro Encoder state\n");
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
361 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
362 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
363 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
364
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
365 /* Copy 'next' frame in queue. */
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
366
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
367 if (p_schro_params->enc_frame_queue.size == 1 &&
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
368 p_schro_params->eos_pulled)
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
369 last_frame_in_sequence = 1;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
370
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
371 p_frame_output = ff_dirac_schro_queue_pop(&p_schro_params->enc_frame_queue);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
372
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 8790
diff changeset
373 if (!p_frame_output)
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
374 return 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
375
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
376 memcpy(frame, p_frame_output->p_encbuf, p_frame_output->size);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
377 avccontext->coded_frame->key_frame = p_frame_output->key_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
378 /* Use the frame number of the encoded frame as the pts. It is OK to
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
379 * do so since Dirac is a constant frame rate codec. It expects input
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
380 * to be of constant frame rate. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
381 avccontext->coded_frame->pts = p_frame_output->frame_num;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
382 enc_size = p_frame_output->size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
383
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
384 /* Append the end of sequence information to the last frame in the
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
385 * sequence. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
386 if (last_frame_in_sequence && p_schro_params->enc_buf_size > 0) {
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
387 memcpy(frame + enc_size, p_schro_params->enc_buf,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
388 p_schro_params->enc_buf_size);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
389 enc_size += p_schro_params->enc_buf_size;
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
390 av_freep(&p_schro_params->enc_buf);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
391 p_schro_params->enc_buf_size = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
392 }
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
393
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
394 /* free frame */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
395 SchroedingerFreeFrame(p_frame_output);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
396
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
397 return enc_size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
398 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
399
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
400
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
401 static int libschroedinger_encode_close(AVCodecContext *avccontext)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
402 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
403
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
404 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
405
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
406 /* Close the encoder. */
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
407 schro_encoder_free(p_schro_params->encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
408
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
409 /* Free data in the output frame queue. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
410 ff_dirac_schro_queue_free(&p_schro_params->enc_frame_queue,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
411 SchroedingerFreeFrame);
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
412
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
413
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
414 /* Free the encoder buffer. */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
415 if (p_schro_params->enc_buf_size)
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
416 av_freep(&p_schro_params->enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
417
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
418 /* Free the video format structure. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
419 av_freep(&p_schro_params->format);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
420
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
421 return 0;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
422 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
423
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
424
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
425 AVCodec libschroedinger_encoder = {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
426 "libschroedinger",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10146
diff changeset
427 AVMEDIA_TYPE_VIDEO,
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
428 CODEC_ID_DIRAC,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
429 sizeof(FfmpegSchroEncoderParams),
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
430 libschroedinger_encode_init,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
431 libschroedinger_encode_frame,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
432 libschroedinger_encode_close,
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
433 .capabilities = CODEC_CAP_DELAY,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 10061
diff changeset
434 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_NONE},
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10058
diff changeset
435 .long_name = NULL_IF_CONFIG_SMALL("libschroedinger Dirac 2.2"),
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
436 };