annotate libdiracenc.c @ 7354:456957d86106 libavcodec

My commit at r14340 was not the right solution. For a monochromatic frame, there will be only one centroid and it will be impossible to find three distinct ones. It is better to just avoid shifting if there are not three different centroids.
author vitor
date Wed, 23 Jul 2008 05:54:34 +0000
parents e674db16f1c6
children e6348a5656e0
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 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
24 * @file libdiracenc.c
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 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
41 typedef struct FfmpegDiracEncoderParams
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
42 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
43 /** Dirac encoder context */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
44 dirac_encoder_context_t enc_ctx;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
45
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
46 /** frame being encoded */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
47 AVFrame picture;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
48
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
49 /** frame size */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
50 int frame_size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
51
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
52 /** Dirac encoder handle */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
53 dirac_encoder_t* p_encoder;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
54
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
55 /** input frame buffer */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
56 unsigned char *p_in_frame_buf;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
57
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
58 /** 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
59 unsigned char *enc_buf;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
60
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
61 /** size of encoder buffer */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
62 int enc_buf_size;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
63
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
64 /** queue storing encoded frames */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
65 FfmpegDiracSchroQueue enc_frame_queue;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
66
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
67 /** end of sequence signalled by user, 0 - false, 1 - true */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
68 int eos_signalled;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
69
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
70 /** end of sequence returned by encoder, 0 - false, 1 - true */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
71 int eos_pulled;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
72 } FfmpegDiracEncoderParams;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
73
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
74 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
75 * Works out Dirac-compatible chroma format.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
76 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
77 static dirac_chroma_t GetDiracChromaFormat(enum PixelFormat ff_pix_fmt)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
78 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
79 int num_formats = sizeof(ffmpeg_dirac_pixel_format_map) /
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
80 sizeof(ffmpeg_dirac_pixel_format_map[0]);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
81 int idx;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
82
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
83 for (idx = 0; idx < num_formats; ++idx) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
84 if (ffmpeg_dirac_pixel_format_map[idx].ff_pix_fmt == ff_pix_fmt) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
85 return ffmpeg_dirac_pixel_format_map[idx].dirac_pix_fmt;
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 return formatNK;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
89 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
90
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
91 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
92 * Dirac video preset table. Ensure that this tables matches up correctly
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
93 * with the ff_dirac_schro_video_format_info table in libdirac_libschro.c.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
94 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
95 static const VideoFormat ff_dirac_video_formats[]={
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
96 VIDEO_FORMAT_CUSTOM ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
97 VIDEO_FORMAT_QSIF525 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
98 VIDEO_FORMAT_QCIF ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
99 VIDEO_FORMAT_SIF525 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
100 VIDEO_FORMAT_CIF ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
101 VIDEO_FORMAT_4SIF525 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
102 VIDEO_FORMAT_4CIF ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
103 VIDEO_FORMAT_SD_480I60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
104 VIDEO_FORMAT_SD_576I50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
105 VIDEO_FORMAT_HD_720P60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
106 VIDEO_FORMAT_HD_720P50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
107 VIDEO_FORMAT_HD_1080I60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
108 VIDEO_FORMAT_HD_1080I50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
109 VIDEO_FORMAT_HD_1080P60 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
110 VIDEO_FORMAT_HD_1080P50 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
111 VIDEO_FORMAT_DIGI_CINEMA_2K24 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
112 VIDEO_FORMAT_DIGI_CINEMA_4K24 ,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
113 };
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
114
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
115 /**
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
116 * Returns the video format preset matching the input video dimensions and
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
117 * time base.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
118 */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
119 static VideoFormat GetDiracVideoFormatPreset (AVCodecContext *avccontext)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
120 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
121 unsigned int num_formats = sizeof(ff_dirac_video_formats) /
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
122 sizeof(ff_dirac_video_formats[0]);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
123
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
124 unsigned int idx = ff_dirac_schro_get_video_format_idx (avccontext);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
125
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
126 return (idx < num_formats) ?
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
127 ff_dirac_video_formats[idx] : VIDEO_FORMAT_CUSTOM;
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 static int libdirac_encode_init(AVCodecContext *avccontext)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
131 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
132
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
133 FfmpegDiracEncoderParams* p_dirac_params = avccontext->priv_data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
134 int no_local = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
135 int verbose = avccontext->debug;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
136 VideoFormat preset;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
137
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
138 /* get Dirac preset */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
139 preset = GetDiracVideoFormatPreset(avccontext);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
140
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
141 /* initialize the encoder context */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
142 dirac_encoder_context_init (&(p_dirac_params->enc_ctx), preset);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
143
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
144 p_dirac_params->enc_ctx.src_params.chroma =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
145 GetDiracChromaFormat(avccontext->pix_fmt);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
146
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
147 if (p_dirac_params->enc_ctx.src_params.chroma == formatNK) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
148 av_log (avccontext, AV_LOG_ERROR,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
149 "Unsupported pixel format %d. This codec supports only "
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
150 "Planar YUV formats (yuv420p, yuv422p, yuv444p\n",
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
151 avccontext->pix_fmt);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
152 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
153 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
154
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
155 p_dirac_params->enc_ctx.src_params.frame_rate.numerator =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
156 avccontext->time_base.den;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
157 p_dirac_params->enc_ctx.src_params.frame_rate.denominator =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
158 avccontext->time_base.num;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
159
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
160 p_dirac_params->enc_ctx.src_params.width = avccontext->width;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
161 p_dirac_params->enc_ctx.src_params.height = avccontext->height;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
162
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
163 p_dirac_params->frame_size = avpicture_get_size(avccontext->pix_fmt,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
164 avccontext->width,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
165 avccontext->height);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
166
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
167 avccontext->coded_frame = &p_dirac_params->picture;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
168
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
169 if (no_local) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
170 p_dirac_params->enc_ctx.decode_flag = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
171 p_dirac_params->enc_ctx.instr_flag = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
172 } else {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
173 p_dirac_params->enc_ctx.decode_flag = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
174 p_dirac_params->enc_ctx.instr_flag = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
175 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
176
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
177 /* Intra-only sequence */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
178 if (avccontext->gop_size == 0 )
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
179 p_dirac_params->enc_ctx.enc_params.num_L1 = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
180 else
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
181 avccontext->has_b_frames = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
182
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
183 if (avccontext->flags & CODEC_FLAG_QSCALE) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
184 if (avccontext->global_quality != 0) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
185 p_dirac_params->enc_ctx.enc_params.qf =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
186 avccontext->global_quality / (FF_QP2LAMBDA*10.0);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
187 /* if it is not default bitrate then send target rate. */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
188 if (avccontext->bit_rate >= 1000 &&
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
189 avccontext->bit_rate != 200000) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
190 p_dirac_params->enc_ctx.enc_params.trate =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
191 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 } else
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
194 p_dirac_params->enc_ctx.enc_params.lossless = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
195 } else if (avccontext->bit_rate >= 1000)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
196 p_dirac_params->enc_ctx.enc_params.trate = avccontext->bit_rate / 1000;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
197
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
198 if ((preset > VIDEO_FORMAT_QCIF || preset < VIDEO_FORMAT_QSIF525) &&
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
199 avccontext->bit_rate == 200000) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
200 p_dirac_params->enc_ctx.enc_params.trate = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
201 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
202
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
203 if (avccontext->flags & CODEC_FLAG_INTERLACED_ME) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
204 /* all material can be coded as interlaced or progressive
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
205 * irrespective of the type of source material */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
206 p_dirac_params->enc_ctx.enc_params.picture_coding_mode = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
207 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
208
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
209 p_dirac_params->p_encoder = dirac_encoder_init (&(p_dirac_params->enc_ctx),
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
210 verbose );
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
211
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
212 if (!p_dirac_params->p_encoder) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
213 av_log(avccontext, AV_LOG_ERROR,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
214 "Unrecoverable Error: dirac_encoder_init failed. ");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
215 return EXIT_FAILURE;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
216 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
217
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
218 /* allocate enough memory for the incoming data */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
219 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
220
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
221 /* initialize the encoded frame queue */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
222 ff_dirac_schro_queue_init(&p_dirac_params->enc_frame_queue);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
223
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
224 return 0 ;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
225 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
226
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
227 static void DiracFreeFrame (void *data)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
228 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
229 FfmpegDiracSchroEncodedFrame *enc_frame = data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
230
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
231 av_freep (&(enc_frame->p_encbuf));
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
232 av_free(enc_frame);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
233 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
234
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
235 static int libdirac_encode_frame(AVCodecContext *avccontext,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
236 unsigned char *frame,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
237 int buf_size, void *data)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
238 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
239 int enc_size = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
240 dirac_encoder_state_t state;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
241 FfmpegDiracEncoderParams* p_dirac_params = avccontext->priv_data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
242 FfmpegDiracSchroEncodedFrame* p_frame_output = NULL;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
243 FfmpegDiracSchroEncodedFrame* p_next_output_frame = NULL;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
244 int go = 1;
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
245 int last_frame_in_sequence = 0;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
246
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
247 if (data == NULL) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
248 /* push end of sequence if not already signalled */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
249 if (!p_dirac_params->eos_signalled) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
250 dirac_encoder_end_sequence( p_dirac_params->p_encoder );
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
251 p_dirac_params->eos_signalled = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
252 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
253 } else {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
254
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
255 /* Allocate frame data to Dirac input buffer.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
256 * Input line size may differ from what the codec supports,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
257 * especially when transcoding from one format to another.
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
258 * So use avpicture_layout to copy the frame. */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
259 avpicture_layout ((AVPicture *)data, avccontext->pix_fmt,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
260 avccontext->width, avccontext->height,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
261 p_dirac_params->p_in_frame_buf,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
262 p_dirac_params->frame_size);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
263
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
264 /* load next frame */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
265 if (dirac_encoder_load (p_dirac_params->p_encoder,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
266 p_dirac_params->p_in_frame_buf,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
267 p_dirac_params->frame_size ) < 0) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
268 av_log(avccontext, AV_LOG_ERROR, "Unrecoverable Encoder Error."
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
269 " dirac_encoder_load failed...\n");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
270 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
271 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
272 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
273
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
274 if (p_dirac_params->eos_pulled)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
275 go = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
276
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
277 while(go) {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
278 p_dirac_params->p_encoder->enc_buf.buffer = frame;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
279 p_dirac_params->p_encoder->enc_buf.size = buf_size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
280 /* process frame */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
281 state = dirac_encoder_output ( p_dirac_params->p_encoder );
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
282
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
283 switch (state)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
284 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
285 case ENC_STATE_AVAIL:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
286 case ENC_STATE_EOS:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
287 assert (p_dirac_params->p_encoder->enc_buf.size > 0);
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
288
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
289 /* All non-frame data is prepended to actual frame data to
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
290 * 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
291 * to the frame output queue until we actually have a frame
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
292 */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
293
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
294 p_dirac_params->enc_buf = av_realloc (
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
295 p_dirac_params->enc_buf,
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
296 p_dirac_params->enc_buf_size +
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
297 p_dirac_params->p_encoder->enc_buf.size
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 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
300 p_dirac_params->p_encoder->enc_buf.buffer,
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
301 p_dirac_params->p_encoder->enc_buf.size);
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
302
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
303 p_dirac_params->enc_buf_size +=
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
304 p_dirac_params->p_encoder->enc_buf.size;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
305
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
306 if (state == ENC_STATE_EOS) {
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
307 p_dirac_params->eos_pulled = 1;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
308 go = 0;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
309 }
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
310
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
311 /* 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
312 * encoded frame back from the encoder. */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
313 if (p_dirac_params->p_encoder->enc_pparams.pnum == -1)
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
314 break;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
315
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
316 /* create output frame */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
317 p_frame_output = av_mallocz(sizeof(FfmpegDiracSchroEncodedFrame));
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
318 /* set output data */
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
319 p_frame_output->size = p_dirac_params->enc_buf_size;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
320 p_frame_output->p_encbuf = p_dirac_params->enc_buf;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
321 p_frame_output->frame_num =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
322 p_dirac_params->p_encoder->enc_pparams.pnum;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
323
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
324 if (p_dirac_params->p_encoder->enc_pparams.ptype == INTRA_PICTURE &&
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
325 p_dirac_params->p_encoder->enc_pparams.rtype == REFERENCE_PICTURE)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
326 p_frame_output->key_frame = 1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
327
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
328 ff_dirac_schro_queue_push_back (&p_dirac_params->enc_frame_queue,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
329 p_frame_output);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
330
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
331 p_dirac_params->enc_buf_size = 0;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
332 p_dirac_params->enc_buf = NULL;
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
333 break;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
334
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
335 case ENC_STATE_BUFFER:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
336 go = 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
337 break;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
338
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
339 case ENC_STATE_INVALID:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
340 av_log(avccontext, AV_LOG_ERROR,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
341 "Unrecoverable Dirac Encoder Error. Quitting...\n");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
342 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
343
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
344 default:
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
345 av_log(avccontext, AV_LOG_ERROR, "Unknown Dirac Encoder state\n");
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
346 return -1;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
347 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
348 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
349
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
350 /* copy 'next' frame in queue */
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
351
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
352 if (p_dirac_params->enc_frame_queue.size == 1 &&
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
353 p_dirac_params->eos_pulled)
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
354 last_frame_in_sequence = 1;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
355
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
356 p_next_output_frame =
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
357 ff_dirac_schro_queue_pop(&p_dirac_params->enc_frame_queue);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
358
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
359 if (p_next_output_frame == NULL)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
360 return 0;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
361
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
362 memcpy(frame, p_next_output_frame->p_encbuf, p_next_output_frame->size);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
363 avccontext->coded_frame->key_frame = p_next_output_frame->key_frame;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
364 /* 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
365 * so since Dirac is a constant framerate codec. It expects input to be
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
366 * of constant framerate. */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
367 avccontext->coded_frame->pts = p_next_output_frame->frame_num;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
368 enc_size = p_next_output_frame->size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
369
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
370 /* 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
371 * sequence. */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
372 if (last_frame_in_sequence && p_dirac_params->enc_buf_size > 0)
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
373 {
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
374 memcpy (frame + enc_size, p_dirac_params->enc_buf,
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
375 p_dirac_params->enc_buf_size);
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
376 enc_size += p_dirac_params->enc_buf_size;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
377 av_freep (&p_dirac_params->enc_buf);
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
378 p_dirac_params->enc_buf_size = 0;
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
379 }
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
380
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
381 /* free frame */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
382 DiracFreeFrame(p_next_output_frame);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
383
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
384 return enc_size;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
385 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
386
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
387 static int libdirac_encode_close(AVCodecContext *avccontext)
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
388 {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
389 FfmpegDiracEncoderParams* p_dirac_params = avccontext->priv_data;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
390
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
391 /* close the encoder */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
392 dirac_encoder_close(p_dirac_params->p_encoder );
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
393
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
394 /* free data in the output frame queue */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
395 ff_dirac_schro_queue_free(&p_dirac_params->enc_frame_queue,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
396 DiracFreeFrame);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
397
7252
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
398 /* free the encoder buffer */
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
399 if (p_dirac_params->enc_buf_size)
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
400 av_freep(&p_dirac_params->enc_buf);
e674db16f1c6 Fix pts handling when encoding with libdirac.
diego
parents: 7040
diff changeset
401
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
402 /* free the input frame buffer */
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
403 av_freep(&p_dirac_params->p_in_frame_buf);
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
404
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
405 return 0 ;
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
406 }
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
407
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
408
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
409 AVCodec libdirac_encoder = {
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
410 "libdirac",
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
411 CODEC_TYPE_VIDEO,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
412 CODEC_ID_DIRAC,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
413 sizeof(FfmpegDiracEncoderParams),
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
414 libdirac_encode_init,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
415 libdirac_encode_frame,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
416 libdirac_encode_close,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
417 .capabilities= CODEC_CAP_DELAY,
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
418 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, -1},
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6819
diff changeset
419 .long_name= NULL_IF_CONFIG_SMALL("libdirac Dirac 2.2"),
6734
df467cebd0d3 Dirac decoding/encoding support via libdirac.
diego
parents:
diff changeset
420 } ;