annotate libschroedingerenc.c @ 8790:1045a26cb90d libavcodec

Fix crash when encoding using libschroedinger. Currently only pixel and half-pixel motion vector precisions are supported in libschroedinger. Setting the mv_precision field to 2 (i.e. quarter pixel) causes a crash in the libschroedinger encoder calls. By not setting this parameter, we fall back to the default value used in libschroedinger. patch by Anuradha Suraparaju, anuradha rd.bbc.co uk
author diego
date Tue, 10 Feb 2009 14:27:16 +0000
parents e9d9d946f213
children fdb318d12314
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 7839
diff changeset
23 * @file libavcodec/libschroedingerenc.c
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"
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
40
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
41
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
42 /** libschroedinger encoder private data */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
43 typedef struct FfmpegSchroEncoderParams
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
44 {
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 ==
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
89 avccontext->pix_fmt) {
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
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
96 av_log (avccontext, AV_LOG_ERROR,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
97 "This codec currently only supports planar YUV 4:2:0, 4:2:2"
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
98 " and 4:4:4 formats.\n");
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);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
124 schro_video_format_set_std_video_format (p_schro_params->format, preset);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
125 p_schro_params->format->width = avccontext->width;
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
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
131 if (ff_get_schro_frame_format(p_schro_params->format->chroma_format,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
132 &p_schro_params->frame_format) == -1) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
133 av_log (avccontext, AV_LOG_ERROR,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
134 "This codec currently supports only planar YUV 4:2:0, 4:2:2"
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
135 " and 4:4:4 formats.\n");
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
136 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
137 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
138
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
139 p_schro_params->format->frame_rate_numerator = avccontext->time_base.den;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
140 p_schro_params->format->frame_rate_denominator = avccontext->time_base.num;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
141
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
142 p_schro_params->frame_size = avpicture_get_size(avccontext->pix_fmt,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
143 avccontext->width,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
144 avccontext->height);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
145
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
146 avccontext->coded_frame = &p_schro_params->picture;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
147
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
148 if (avccontext->gop_size == 0){
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
149 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
150 "gop_structure",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
151 SCHRO_ENCODER_GOP_INTRA_ONLY);
7839
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7253
diff changeset
152
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7253
diff changeset
153 if (avccontext->coder_type == FF_CODER_TYPE_VLC) {
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7253
diff changeset
154 schro_encoder_setting_set_double (p_schro_params->encoder,
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7253
diff changeset
155 "enable_noarith", 1);
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7253
diff changeset
156 }
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
157 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
158 else {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
159 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
160 "gop_structure",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
161 SCHRO_ENCODER_GOP_BIREF);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
162 avccontext->has_b_frames = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
163 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
164
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
165 /* FIXME - Need to handle SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
166 if (avccontext->flags & CODEC_FLAG_QSCALE) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
167 if (avccontext->global_quality == 0) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
168 /* lossless coding */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
169 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
170 "rate_control",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
171 SCHRO_ENCODER_RATE_CONTROL_LOSSLESS);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
172 } else {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
173 int noise_threshold;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
174 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
175 "rate_control",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
176 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_NOISE_THRESHOLD);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
177
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
178 noise_threshold = avccontext->global_quality/FF_QP2LAMBDA;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
179 if (noise_threshold > 100)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
180 noise_threshold = 100;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
181 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
182 "noise_threshold",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
183 noise_threshold);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
184 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
185 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
186 else {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
187 schro_encoder_setting_set_double ( p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
188 "rate_control",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
189 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
190
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
191 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
192 "bitrate",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
193 avccontext->bit_rate);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
194
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
195 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
196
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
197 if (avccontext->flags & CODEC_FLAG_INTERLACED_ME) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
198 /* All material can be coded as interlaced or progressive
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
199 irrespective of the type of source material. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
200 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
201 "interlaced_coding", 1);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
202 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
203
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
204 /* FIXME: Signal range hardcoded to 8-bit data until both libschroedinger
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
205 * and libdirac support other bit-depth data. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
206 schro_video_format_set_std_signal_range(p_schro_params->format,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
207 SCHRO_SIGNAL_RANGE_8BIT_VIDEO);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
208
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
209 /* Set the encoder format. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
210 schro_encoder_set_video_format(p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
211 p_schro_params->format);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
212
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
213 /* Set the debug level. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
214 schro_debug_set_level (avccontext->debug);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
215
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
216 schro_encoder_start (p_schro_params->encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
217
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
218 /* Initialize the encoded frame queue. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
219 ff_dirac_schro_queue_init (&p_schro_params->enc_frame_queue);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
220 return 0 ;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
221 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
222
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
223 static SchroFrame *libschroedinger_frame_from_data (AVCodecContext *avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
224 void *in_data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
225 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
226 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
227 SchroFrame *in_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
228 /* Input line size may differ from what the codec supports. Especially
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
229 * when transcoding from one format to another. So use avpicture_layout
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
230 * to copy the frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
231 in_frame = schro_frame_new_and_alloc (NULL,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
232 p_schro_params->frame_format,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
233 p_schro_params->format->width,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
234 p_schro_params->format->height);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
235
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
236 avpicture_layout ((AVPicture *)in_data, avccontext->pix_fmt,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
237 avccontext->width, avccontext->height,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
238 in_frame->components[0].data,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
239 p_schro_params->frame_size);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
240
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
241 return in_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
242 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
243
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
244 static void SchroedingerFreeFrame(void *data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
245 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
246 FfmpegDiracSchroEncodedFrame *enc_frame = data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
247
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
248 av_freep (&(enc_frame->p_encbuf));
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
249 av_free(enc_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
250 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
251
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
252 static int libschroedinger_encode_frame(AVCodecContext *avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
253 unsigned char *frame,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
254 int buf_size, void *data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
255 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
256 int enc_size = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
257 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
258 SchroEncoder *encoder = p_schro_params->encoder;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
259 struct FfmpegDiracSchroEncodedFrame* p_frame_output = NULL;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
260 int go = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
261 SchroBuffer *enc_buf;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
262 int presentation_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
263 int parse_code;
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
264 int last_frame_in_sequence = 0;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
265
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
266 if(data == NULL) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
267 /* Push end of sequence if not already signalled. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
268 if (!p_schro_params->eos_signalled) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
269 schro_encoder_end_of_stream(encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
270 p_schro_params->eos_signalled = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
271 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
272 } else {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
273 /* Allocate frame data to schro input buffer. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
274 SchroFrame *in_frame = libschroedinger_frame_from_data (avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
275 data);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
276 /* Load next frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
277 schro_encoder_push_frame(encoder, in_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
278 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
279
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
280 if (p_schro_params->eos_pulled)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
281 go = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
282
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
283 /* Now check to see if we have any output from the encoder. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
284 while (go) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
285 SchroStateEnum state;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
286 state = schro_encoder_wait(encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
287 switch (state)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
288 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
289 case SCHRO_STATE_HAVE_BUFFER:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
290 case SCHRO_STATE_END_OF_STREAM:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
291 enc_buf = schro_encoder_pull (encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
292 &presentation_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
293 assert (enc_buf->length > 0);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
294 assert (enc_buf->length <= buf_size);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
295 parse_code = enc_buf->data[4];
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
296
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
297 /* 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
298 * 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
299 * 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
300 */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
301 p_schro_params->enc_buf = av_realloc (
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
302 p_schro_params->enc_buf,
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
303 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
304 );
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
305
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
306 memcpy(p_schro_params->enc_buf+p_schro_params->enc_buf_size,
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
307 enc_buf->data, enc_buf->length);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
308 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
309
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
310
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
311 if (state == SCHRO_STATE_END_OF_STREAM) {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
312 p_schro_params->eos_pulled = 1;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
313 go = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
314 }
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
315
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
316 if (!SCHRO_PARSE_CODE_IS_PICTURE(parse_code)) {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
317 schro_buffer_unref (enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
318 break;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
319 }
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
320
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
321 /* Create output frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
322 p_frame_output = av_mallocz(sizeof(FfmpegDiracSchroEncodedFrame));
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
323 /* Set output data. */
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
324 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
325 p_frame_output->p_encbuf = p_schro_params->enc_buf;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
326 if (SCHRO_PARSE_CODE_IS_INTRA(parse_code) &&
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
327 SCHRO_PARSE_CODE_IS_REFERENCE(parse_code)) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
328 p_frame_output->key_frame = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
329 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
330
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
331 /* Parse the coded frame number from the bitstream. Bytes 14
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
332 * through 17 represesent the frame number. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
333 p_frame_output->frame_num = (enc_buf->data[13] << 24) +
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
334 (enc_buf->data[14] << 16) +
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
335 (enc_buf->data[15] << 8) +
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
336 enc_buf->data[16];
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
337
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
338 ff_dirac_schro_queue_push_back (&p_schro_params->enc_frame_queue,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
339 p_frame_output);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
340 p_schro_params->enc_buf_size = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
341 p_schro_params->enc_buf = NULL;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
342
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
343 schro_buffer_unref (enc_buf);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
344
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
345 break;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
346
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
347 case SCHRO_STATE_NEED_FRAME:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
348 go = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
349 break;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
350
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
351 case SCHRO_STATE_AGAIN:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
352 break;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
353
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
354 default:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
355 av_log(avccontext, AV_LOG_ERROR, "Unknown Schro Encoder state\n");
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
356 return -1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
357 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
358 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
359
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
360 /* Copy 'next' frame in queue. */
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
361
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
362 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
363 p_schro_params->eos_pulled)
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
364 last_frame_in_sequence = 1;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
365
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
366 p_frame_output =
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
367 ff_dirac_schro_queue_pop (&p_schro_params->enc_frame_queue);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
368
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
369 if (p_frame_output == NULL)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
370 return 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
371
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
372 memcpy(frame, p_frame_output->p_encbuf, p_frame_output->size);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
373 avccontext->coded_frame->key_frame = p_frame_output->key_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
374 /* 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
375 * do so since Dirac is a constant frame rate codec. It expects input
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
376 * to be of constant frame rate. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
377 avccontext->coded_frame->pts = p_frame_output->frame_num;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
378 enc_size = p_frame_output->size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
379
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
380 /* 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
381 * sequence. */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
382 if (last_frame_in_sequence && p_schro_params->enc_buf_size > 0)
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
383 {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
384 memcpy (frame + enc_size, p_schro_params->enc_buf,
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
385 p_schro_params->enc_buf_size);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
386 enc_size += p_schro_params->enc_buf_size;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
387 av_freep (&p_schro_params->enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
388 p_schro_params->enc_buf_size = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
389 }
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
390
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
391 /* free frame */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
392 SchroedingerFreeFrame (p_frame_output);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
393
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
394 return enc_size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
395 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
396
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
397
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
398 static int libschroedinger_encode_close(AVCodecContext *avccontext)
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 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
402
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
403 /* Close the encoder. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
404 schro_encoder_free(p_schro_params->encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
405
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
406 /* Free data in the output frame queue. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
407 ff_dirac_schro_queue_free (&p_schro_params->enc_frame_queue,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
408 SchroedingerFreeFrame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
409
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
410
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
411 /* Free the encoder buffer. */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
412 if (p_schro_params->enc_buf_size)
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
413 av_freep(&p_schro_params->enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
414
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
415 /* Free the video format structure. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
416 av_freep(&p_schro_params->format);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
417
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
418 return 0 ;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
419 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
420
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
421
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
422 AVCodec libschroedinger_encoder = {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
423 "libschroedinger",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
424 CODEC_TYPE_VIDEO,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
425 CODEC_ID_DIRAC,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
426 sizeof(FfmpegSchroEncoderParams),
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
427 libschroedinger_encode_init,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
428 libschroedinger_encode_frame,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
429 libschroedinger_encode_close,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
430 .capabilities= CODEC_CAP_DELAY,
6788
e1302edb0f69 Replace some occurrences of -1 with PIX_FMT_NONE.
cehoyos
parents: 6738
diff changeset
431 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_NONE},
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6819
diff changeset
432 .long_name= NULL_IF_CONFIG_SMALL("libschroedinger Dirac 2.2"),
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
433 };