annotate libschroedingerenc.c @ 8520:a0164882aa38 libavcodec

Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel.
author michael
date Sun, 04 Jan 2009 18:48:37 +0000
parents e6348a5656e0
children e9d9d946f213
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 /**
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
23 * @file libschroedingerenc.c
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
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
210 /* Hardcode motion vector precision to quarter pixel. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
211 schro_encoder_setting_set_double (p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
212 "mv_precision", 2);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
213
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
214 /* Set the encoder format. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
215 schro_encoder_set_video_format(p_schro_params->encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
216 p_schro_params->format);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
217
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
218 /* Set the debug level. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
219 schro_debug_set_level (avccontext->debug);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
220
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
221 schro_encoder_start (p_schro_params->encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
222
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
223 /* Initialize the encoded frame queue. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
224 ff_dirac_schro_queue_init (&p_schro_params->enc_frame_queue);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
225 return 0 ;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
226 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
227
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
228 static SchroFrame *libschroedinger_frame_from_data (AVCodecContext *avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
229 void *in_data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
230 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
231 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
232 SchroFrame *in_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
233 /* Input line size may differ from what the codec supports. Especially
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
234 * when transcoding from one format to another. So use avpicture_layout
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
235 * to copy the frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
236 in_frame = schro_frame_new_and_alloc (NULL,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
237 p_schro_params->frame_format,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
238 p_schro_params->format->width,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
239 p_schro_params->format->height);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
240
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
241 avpicture_layout ((AVPicture *)in_data, avccontext->pix_fmt,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
242 avccontext->width, avccontext->height,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
243 in_frame->components[0].data,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
244 p_schro_params->frame_size);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
245
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
246 return in_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
247 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
248
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
249 static void SchroedingerFreeFrame(void *data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
250 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
251 FfmpegDiracSchroEncodedFrame *enc_frame = data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
252
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
253 av_freep (&(enc_frame->p_encbuf));
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
254 av_free(enc_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 int libschroedinger_encode_frame(AVCodecContext *avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
258 unsigned char *frame,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
259 int buf_size, void *data)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
260 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
261 int enc_size = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
262 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
263 SchroEncoder *encoder = p_schro_params->encoder;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
264 struct FfmpegDiracSchroEncodedFrame* p_frame_output = NULL;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
265 int go = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
266 SchroBuffer *enc_buf;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
267 int presentation_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
268 int parse_code;
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
269 int last_frame_in_sequence = 0;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
270
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
271 if(data == NULL) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
272 /* Push end of sequence if not already signalled. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
273 if (!p_schro_params->eos_signalled) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
274 schro_encoder_end_of_stream(encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
275 p_schro_params->eos_signalled = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
276 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
277 } else {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
278 /* Allocate frame data to schro input buffer. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
279 SchroFrame *in_frame = libschroedinger_frame_from_data (avccontext,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
280 data);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
281 /* Load next frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
282 schro_encoder_push_frame(encoder, in_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
283 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
284
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
285 if (p_schro_params->eos_pulled)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
286 go = 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
287
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
288 /* Now check to see if we have any output from the encoder. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
289 while (go) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
290 SchroStateEnum state;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
291 state = schro_encoder_wait(encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
292 switch (state)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
293 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
294 case SCHRO_STATE_HAVE_BUFFER:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
295 case SCHRO_STATE_END_OF_STREAM:
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
296 enc_buf = schro_encoder_pull (encoder,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
297 &presentation_frame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
298 assert (enc_buf->length > 0);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
299 assert (enc_buf->length <= buf_size);
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
300 parse_code = enc_buf->data[4];
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
301
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
302 /* 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
303 * 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
304 * 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
305 */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
306 p_schro_params->enc_buf = av_realloc (
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
307 p_schro_params->enc_buf,
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 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
312 enc_buf->data, enc_buf->length);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
313 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
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 (state == SCHRO_STATE_END_OF_STREAM) {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
317 p_schro_params->eos_pulled = 1;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
318 go = 0;
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
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
321 if (!SCHRO_PARSE_CODE_IS_PICTURE(parse_code)) {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
322 schro_buffer_unref (enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
323 break;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
324 }
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
325
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
326 /* Create output frame. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
327 p_frame_output = av_mallocz(sizeof(FfmpegDiracSchroEncodedFrame));
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
328 /* Set output data. */
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
329 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
330 p_frame_output->p_encbuf = p_schro_params->enc_buf;
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
331 if (SCHRO_PARSE_CODE_IS_INTRA(parse_code) &&
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
332 SCHRO_PARSE_CODE_IS_REFERENCE(parse_code)) {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
333 p_frame_output->key_frame = 1;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
334 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
335
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
336 /* Parse the coded frame number from the bitstream. Bytes 14
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
337 * through 17 represesent the frame number. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
338 p_frame_output->frame_num = (enc_buf->data[13] << 24) +
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
339 (enc_buf->data[14] << 16) +
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
340 (enc_buf->data[15] << 8) +
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
341 enc_buf->data[16];
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
342
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
343 ff_dirac_schro_queue_push_back (&p_schro_params->enc_frame_queue,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
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
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
348 schro_buffer_unref (enc_buf);
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
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
371 p_frame_output =
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
372 ff_dirac_schro_queue_pop (&p_schro_params->enc_frame_queue);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
373
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
374 if (p_frame_output == NULL)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
375 return 0;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
376
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
377 memcpy(frame, p_frame_output->p_encbuf, p_frame_output->size);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
378 avccontext->coded_frame->key_frame = p_frame_output->key_frame;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
379 /* 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
380 * do so since Dirac is a constant frame rate codec. It expects input
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
381 * to be of constant frame rate. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
382 avccontext->coded_frame->pts = p_frame_output->frame_num;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
383 enc_size = p_frame_output->size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
384
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
385 /* 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
386 * sequence. */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
387 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
388 {
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
389 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
390 p_schro_params->enc_buf_size);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
391 enc_size += p_schro_params->enc_buf_size;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
392 av_freep (&p_schro_params->enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
393 p_schro_params->enc_buf_size = 0;
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
394 }
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
395
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
396 /* free frame */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
397 SchroedingerFreeFrame (p_frame_output);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
398
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
399 return enc_size;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
400 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
401
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
402
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
403 static int libschroedinger_encode_close(AVCodecContext *avccontext)
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
404 {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
405
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
406 FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
407
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
408 /* Close the encoder. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
409 schro_encoder_free(p_schro_params->encoder);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
410
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
411 /* Free data in the output frame queue. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
412 ff_dirac_schro_queue_free (&p_schro_params->enc_frame_queue,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
413 SchroedingerFreeFrame);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
414
7253
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
415
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
416 /* Free the encoder buffer. */
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
417 if (p_schro_params->enc_buf_size)
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
418 av_freep(&p_schro_params->enc_buf);
2f5b98d0aa13 Fix pts handling when encoding with libschroedinger, closes issue 453.
diego
parents: 7040
diff changeset
419
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
420 /* Free the video format structure. */
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
421 av_freep(&p_schro_params->format);
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
422
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
423 return 0 ;
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
424 }
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
425
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
426
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
427 AVCodec libschroedinger_encoder = {
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
428 "libschroedinger",
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
429 CODEC_TYPE_VIDEO,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
430 CODEC_ID_DIRAC,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
431 sizeof(FfmpegSchroEncoderParams),
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
432 libschroedinger_encode_init,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
433 libschroedinger_encode_frame,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
434 libschroedinger_encode_close,
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
435 .capabilities= CODEC_CAP_DELAY,
6788
e1302edb0f69 Replace some occurrences of -1 with PIX_FMT_NONE.
cehoyos
parents: 6738
diff changeset
436 .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
437 .long_name= NULL_IF_CONFIG_SMALL("libschroedinger Dirac 2.2"),
6738
bdacae101076 Add Dirac support through libschroedinger.
diego
parents:
diff changeset
438 };