annotate libdiracenc.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
1 /*
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
2 * Dirac encoding support via libdirac library
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
3 * Copyright (c) 2005 BBC, Andrew Kennedy <dirac at rd dot bbc dot co dot uk>
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
4 * Copyright (c) 2006-2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com >
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
5 *
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
6 * This file is part of FFmpeg.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
7 *
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
12 *
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
16 * Lesser General Public License for more details.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
17 *
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
21 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
22
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
23 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
24 * @file
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
25 * Dirac encoding support via libdirac library; more details about the
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
26 * Dirac project can be found at http://dirac.sourceforge.net/.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
27 * The libdirac_encoder library implements Dirac specification version 2.2
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
28 * (http://dirac.sourceforge.net/specification.html).
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
29 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
30
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
31 #include "libdirac_libschro.h"
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
32 #include "libdirac.h"
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
33
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
34 #undef NDEBUG
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
35 #include <assert.h>
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
36
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
37
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
38 #include <libdirac_encoder/dirac_encoder.h>
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
39
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
40 /** Dirac encoder private data */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
41 typedef struct FfmpegDiracEncoderParams {
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
42 /** Dirac encoder context */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
43 dirac_encoder_context_t enc_ctx;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
44
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
45 /** frame being encoded */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
46 AVFrame picture;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
47
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
48 /** frame size */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
49 int frame_size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
50
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
51 /** Dirac encoder handle */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
52 dirac_encoder_t* p_encoder;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
53
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
54 /** input frame buffer */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
55 unsigned char *p_in_frame_buf;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
56
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
57 /** buffer to store encoder output before writing it to the frame queue */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
58 unsigned char *enc_buf;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
59
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
60 /** size of encoder buffer */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
61 int enc_buf_size;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
62
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
63 /** queue storing encoded frames */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
64 FfmpegDiracSchroQueue enc_frame_queue;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
65
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
66 /** end of sequence signalled by user, 0 - false, 1 - true */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
67 int eos_signalled;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
68
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
69 /** end of sequence returned by encoder, 0 - false, 1 - true */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
70 int eos_pulled;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
71 } FfmpegDiracEncoderParams;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
72
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
73 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
74 * Works out Dirac-compatible chroma format.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
75 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
76 static dirac_chroma_t GetDiracChromaFormat(enum PixelFormat ff_pix_fmt)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
77 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
78 int num_formats = sizeof(ffmpeg_dirac_pixel_format_map) /
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
79 sizeof(ffmpeg_dirac_pixel_format_map[0]);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
80 int idx;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
81
10059
c6ace59701ce Drop some more useless braces around if/for constructs.
diego
parents: 10056
diff changeset
82 for (idx = 0; idx < num_formats; ++idx)
c6ace59701ce Drop some more useless braces around if/for constructs.
diego
parents: 10056
diff changeset
83 if (ffmpeg_dirac_pixel_format_map[idx].ff_pix_fmt == ff_pix_fmt)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
84 return ffmpeg_dirac_pixel_format_map[idx].dirac_pix_fmt;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
85 return formatNK;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
86 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
87
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
88 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
89 * Dirac video preset table. Ensure that this tables matches up correctly
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
90 * with the ff_dirac_schro_video_format_info table in libdirac_libschro.c.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
91 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
92 static const VideoFormat ff_dirac_video_formats[]={
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
93 VIDEO_FORMAT_CUSTOM ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
94 VIDEO_FORMAT_QSIF525 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
95 VIDEO_FORMAT_QCIF ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
96 VIDEO_FORMAT_SIF525 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
97 VIDEO_FORMAT_CIF ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
98 VIDEO_FORMAT_4SIF525 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
99 VIDEO_FORMAT_4CIF ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
100 VIDEO_FORMAT_SD_480I60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
101 VIDEO_FORMAT_SD_576I50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
102 VIDEO_FORMAT_HD_720P60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
103 VIDEO_FORMAT_HD_720P50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
104 VIDEO_FORMAT_HD_1080I60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
105 VIDEO_FORMAT_HD_1080I50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
106 VIDEO_FORMAT_HD_1080P60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
107 VIDEO_FORMAT_HD_1080P50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
108 VIDEO_FORMAT_DIGI_CINEMA_2K24 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
109 VIDEO_FORMAT_DIGI_CINEMA_4K24 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
110 };
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
111
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
112 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
113 * Returns the video format preset matching the input video dimensions and
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
114 * time base.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
115 */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
116 static VideoFormat GetDiracVideoFormatPreset(AVCodecContext *avccontext)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
117 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
118 unsigned int num_formats = sizeof(ff_dirac_video_formats) /
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
119 sizeof(ff_dirac_video_formats[0]);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
120
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
121 unsigned int idx = ff_dirac_schro_get_video_format_idx(avccontext);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
122
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
123 return (idx < num_formats) ?
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
124 ff_dirac_video_formats[idx] : VIDEO_FORMAT_CUSTOM;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
125 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
126
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
127 static av_cold int libdirac_encode_init(AVCodecContext *avccontext)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
128 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
129
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
130 FfmpegDiracEncoderParams* p_dirac_params = avccontext->priv_data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
131 int no_local = 1;
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
132 int verbose = avccontext->debug;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
133 VideoFormat preset;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
134
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
135 /* get Dirac preset */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
136 preset = GetDiracVideoFormatPreset(avccontext);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
137
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
138 /* initialize the encoder context */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
139 dirac_encoder_context_init(&(p_dirac_params->enc_ctx), preset);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
140
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
141 p_dirac_params->enc_ctx.src_params.chroma = GetDiracChromaFormat(avccontext->pix_fmt);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
142
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
143 if (p_dirac_params->enc_ctx.src_params.chroma == formatNK) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
144 av_log(avccontext, AV_LOG_ERROR,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
145 "Unsupported pixel format %d. This codec supports only "
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
146 "Planar YUV formats (yuv420p, yuv422p, yuv444p\n",
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
147 avccontext->pix_fmt);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
148 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
149 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
150
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
151 p_dirac_params->enc_ctx.src_params.frame_rate.numerator = avccontext->time_base.den;
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
152 p_dirac_params->enc_ctx.src_params.frame_rate.denominator = avccontext->time_base.num;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
153
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
154 p_dirac_params->enc_ctx.src_params.width = avccontext->width;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
155 p_dirac_params->enc_ctx.src_params.height = avccontext->height;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
156
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
157 p_dirac_params->frame_size = avpicture_get_size(avccontext->pix_fmt,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
158 avccontext->width,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
159 avccontext->height);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
160
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
161 avccontext->coded_frame = &p_dirac_params->picture;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
162
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
163 if (no_local) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
164 p_dirac_params->enc_ctx.decode_flag = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
165 p_dirac_params->enc_ctx.instr_flag = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
166 } else {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
167 p_dirac_params->enc_ctx.decode_flag = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
168 p_dirac_params->enc_ctx.instr_flag = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
169 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
170
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
171 /* Intra-only sequence */
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 9007
diff changeset
172 if (!avccontext->gop_size) {
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
173 p_dirac_params->enc_ctx.enc_params.num_L1 = 0;
7839
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7252
diff changeset
174 if (avccontext->coder_type == FF_CODER_TYPE_VLC)
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7252
diff changeset
175 p_dirac_params->enc_ctx.enc_params.using_ac = 0;
e6348a5656e0 Add support for creating Simple Profile (I-frame only, no arithmetic coding)
diego
parents: 7252
diff changeset
176 } else
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
177 avccontext->has_b_frames = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
178
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
179 if (avccontext->flags & CODEC_FLAG_QSCALE) {
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 9007
diff changeset
180 if (avccontext->global_quality) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
181 p_dirac_params->enc_ctx.enc_params.qf = avccontext->global_quality
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
182 / (FF_QP2LAMBDA * 10.0);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
183 /* if it is not default bitrate then send target rate. */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
184 if (avccontext->bit_rate >= 1000 &&
10056
646065f63290 Remove useless braces around if/for/while expressions.
diego
parents: 10055
diff changeset
185 avccontext->bit_rate != 200000)
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
186 p_dirac_params->enc_ctx.enc_params.trate = avccontext->bit_rate
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
187 / 1000;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
188 } else
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
189 p_dirac_params->enc_ctx.enc_params.lossless = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
190 } else if (avccontext->bit_rate >= 1000)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
191 p_dirac_params->enc_ctx.enc_params.trate = avccontext->bit_rate / 1000;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
192
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
193 if ((preset > VIDEO_FORMAT_QCIF || preset < VIDEO_FORMAT_QSIF525) &&
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
194 avccontext->bit_rate == 200000)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
195 p_dirac_params->enc_ctx.enc_params.trate = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
196
10056
646065f63290 Remove useless braces around if/for/while expressions.
diego
parents: 10055
diff changeset
197 if (avccontext->flags & CODEC_FLAG_INTERLACED_ME)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
198 /* all material can be coded as interlaced or progressive
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
199 * irrespective of the type of source material */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
200 p_dirac_params->enc_ctx.enc_params.picture_coding_mode = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
201
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
202 p_dirac_params->p_encoder = dirac_encoder_init(&(p_dirac_params->enc_ctx),
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
203 verbose);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
204
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
205 if (!p_dirac_params->p_encoder) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
206 av_log(avccontext, AV_LOG_ERROR,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
207 "Unrecoverable Error: dirac_encoder_init failed. ");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
208 return EXIT_FAILURE;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
209 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
210
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
211 /* allocate enough memory for the incoming data */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
212 p_dirac_params->p_in_frame_buf = av_malloc(p_dirac_params->frame_size);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
213
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
214 /* initialize the encoded frame queue */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
215 ff_dirac_schro_queue_init(&p_dirac_params->enc_frame_queue);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
216
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
217 return 0;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
218 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
219
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
220 static void DiracFreeFrame(void *data)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
221 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
222 FfmpegDiracSchroEncodedFrame *enc_frame = data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
223
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
224 av_freep(&(enc_frame->p_encbuf));
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
225 av_free(enc_frame);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
226 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
227
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
228 static int libdirac_encode_frame(AVCodecContext *avccontext,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
229 unsigned char *frame,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
230 int buf_size, void *data)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
231 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
232 int enc_size = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
233 dirac_encoder_state_t state;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
234 FfmpegDiracEncoderParams* p_dirac_params = avccontext->priv_data;
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
235 FfmpegDiracSchroEncodedFrame* p_frame_output = NULL;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
236 FfmpegDiracSchroEncodedFrame* p_next_output_frame = NULL;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
237 int go = 1;
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
238 int last_frame_in_sequence = 0;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
239
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 9007
diff changeset
240 if (!data) {
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
241 /* push end of sequence if not already signalled */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
242 if (!p_dirac_params->eos_signalled) {
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
243 dirac_encoder_end_sequence(p_dirac_params->p_encoder);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
244 p_dirac_params->eos_signalled = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
245 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
246 } else {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
247
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
248 /* Allocate frame data to Dirac input buffer.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
249 * Input line size may differ from what the codec supports,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
250 * especially when transcoding from one format to another.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
251 * So use avpicture_layout to copy the frame. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
252 avpicture_layout((AVPicture *)data, avccontext->pix_fmt,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
253 avccontext->width, avccontext->height,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
254 p_dirac_params->p_in_frame_buf,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
255 p_dirac_params->frame_size);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
256
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
257 /* load next frame */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
258 if (dirac_encoder_load(p_dirac_params->p_encoder,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
259 p_dirac_params->p_in_frame_buf,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
260 p_dirac_params->frame_size) < 0) {
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
261 av_log(avccontext, AV_LOG_ERROR, "Unrecoverable Encoder Error."
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
262 " dirac_encoder_load failed...\n");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
263 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
264 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
265 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
266
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
267 if (p_dirac_params->eos_pulled)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
268 go = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
269
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
270 while (go) {
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
271 p_dirac_params->p_encoder->enc_buf.buffer = frame;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
272 p_dirac_params->p_encoder->enc_buf.size = buf_size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
273 /* process frame */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
274 state = dirac_encoder_output(p_dirac_params->p_encoder);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
275
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
276 switch (state) {
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
277 case ENC_STATE_AVAIL:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
278 case ENC_STATE_EOS:
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
279 assert(p_dirac_params->p_encoder->enc_buf.size > 0);
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
280
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
281 /* All non-frame data is prepended to actual frame data to
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
282 * be able to set the pts correctly. So we don't write data
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
283 * to the frame output queue until we actually have a frame
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
284 */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
285
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
286 p_dirac_params->enc_buf = av_realloc(p_dirac_params->enc_buf,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
287 p_dirac_params->enc_buf_size +
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
288 p_dirac_params->p_encoder->enc_buf.size);
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
289 memcpy(p_dirac_params->enc_buf + p_dirac_params->enc_buf_size,
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
290 p_dirac_params->p_encoder->enc_buf.buffer,
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
291 p_dirac_params->p_encoder->enc_buf.size);
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
292
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
293 p_dirac_params->enc_buf_size += p_dirac_params->p_encoder->enc_buf.size;
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
294
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
295 if (state == ENC_STATE_EOS) {
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
296 p_dirac_params->eos_pulled = 1;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
297 go = 0;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
298 }
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
299
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
300 /* If non-frame data, don't output it until it we get an
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
301 * encoded frame back from the encoder. */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
302 if (p_dirac_params->p_encoder->enc_pparams.pnum == -1)
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
303 break;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
304
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
305 /* create output frame */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
306 p_frame_output = av_mallocz(sizeof(FfmpegDiracSchroEncodedFrame));
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
307 /* set output data */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
308 p_frame_output->size = p_dirac_params->enc_buf_size;
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
309 p_frame_output->p_encbuf = p_dirac_params->enc_buf;
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
310 p_frame_output->frame_num = p_dirac_params->p_encoder->enc_pparams.pnum;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
311
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
312 if (p_dirac_params->p_encoder->enc_pparams.ptype == INTRA_PICTURE &&
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
313 p_dirac_params->p_encoder->enc_pparams.rtype == REFERENCE_PICTURE)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
314 p_frame_output->key_frame = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
315
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
316 ff_dirac_schro_queue_push_back(&p_dirac_params->enc_frame_queue,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
317 p_frame_output);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
318
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
319 p_dirac_params->enc_buf_size = 0;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
320 p_dirac_params->enc_buf = NULL;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
321 break;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
322
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
323 case ENC_STATE_BUFFER:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
324 go = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
325 break;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
326
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
327 case ENC_STATE_INVALID:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
328 av_log(avccontext, AV_LOG_ERROR,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
329 "Unrecoverable Dirac Encoder Error. Quitting...\n");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
330 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
331
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
332 default:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
333 av_log(avccontext, AV_LOG_ERROR, "Unknown Dirac Encoder state\n");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
334 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
335 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
336 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
337
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
338 /* copy 'next' frame in queue */
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
339
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
340 if (p_dirac_params->enc_frame_queue.size == 1 && p_dirac_params->eos_pulled)
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
341 last_frame_in_sequence = 1;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
342
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
343 p_next_output_frame = ff_dirac_schro_queue_pop(&p_dirac_params->enc_frame_queue);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
344
10055
fdb318d12314 Simplify 'if' condition statements.
diego
parents: 9007
diff changeset
345 if (!p_next_output_frame)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
346 return 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
347
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
348 memcpy(frame, p_next_output_frame->p_encbuf, p_next_output_frame->size);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
349 avccontext->coded_frame->key_frame = p_next_output_frame->key_frame;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
350 /* Use the frame number of the encoded frame as the pts. It is OK to do
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
351 * so since Dirac is a constant framerate codec. It expects input to be
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
352 * of constant framerate. */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
353 avccontext->coded_frame->pts = p_next_output_frame->frame_num;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
354 enc_size = p_next_output_frame->size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
355
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
356 /* Append the end of sequence information to the last frame in the
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
357 * sequence. */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
358 if (last_frame_in_sequence && p_dirac_params->enc_buf_size > 0) {
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
359 memcpy(frame + enc_size, p_dirac_params->enc_buf,
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
360 p_dirac_params->enc_buf_size);
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
361 enc_size += p_dirac_params->enc_buf_size;
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
362 av_freep(&p_dirac_params->enc_buf);
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
363 p_dirac_params->enc_buf_size = 0;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
364 }
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
365
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
366 /* free frame */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
367 DiracFreeFrame(p_next_output_frame);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
368
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
369 return enc_size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
370 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
371
9007
043574c5c153 Add missing av_cold in static init/close functions.
stefano
parents: 8718
diff changeset
372 static av_cold int libdirac_encode_close(AVCodecContext *avccontext)
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
373 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
374 FfmpegDiracEncoderParams* p_dirac_params = avccontext->priv_data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
375
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
376 /* close the encoder */
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
377 dirac_encoder_close(p_dirac_params->p_encoder);
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
378
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
379 /* free data in the output frame queue */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
380 ff_dirac_schro_queue_free(&p_dirac_params->enc_frame_queue,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
381 DiracFreeFrame);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
382
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
383 /* free the encoder buffer */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
384 if (p_dirac_params->enc_buf_size)
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
385 av_freep(&p_dirac_params->enc_buf);
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
386
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
387 /* free the input frame buffer */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
388 av_freep(&p_dirac_params->p_in_frame_buf);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
389
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
390 return 0;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
391 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
392
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
393
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
394 AVCodec libdirac_encoder = {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
395 "libdirac",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10146
diff changeset
396 AVMEDIA_TYPE_VIDEO,
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
397 CODEC_ID_DIRAC,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
398 sizeof(FfmpegDiracEncoderParams),
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
399 libdirac_encode_init,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
400 libdirac_encode_frame,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
401 libdirac_encode_close,
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
402 .capabilities = CODEC_CAP_DELAY,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 10060
diff changeset
403 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_NONE},
10060
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
404 .long_name = NULL_IF_CONFIG_SMALL("libdirac Dirac 2.2"),
965220ebc611 cosmetics: indentation, prettyprinting, K&R coding style
diego
parents: 10059
diff changeset
405 };