Mercurial > libavcodec.hg
annotate alacenc.c @ 9595:f9a7147cc9e6 libavcodec
Do not scan for MP3 header after the given buffer and return skipped
bytes along with consumed bytes on successful decoding.
patch by Zdenek Kabelac, zdenek.kabelac gmail com
author | diego |
---|---|
date | Mon, 04 May 2009 14:23:48 +0000 |
parents | 0dce4fe6e6f3 |
children | f55ca9a2b948 |
rev | line source |
---|---|
7595 | 1 /** |
2 * ALAC audio encoder | |
3 * Copyright (c) 2008 Jaikrishnan Menon <realityman@gmx.net> | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 #include "avcodec.h" | |
9428 | 23 #include "get_bits.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9110
diff
changeset
|
24 #include "put_bits.h" |
7595 | 25 #include "dsputil.h" |
26 #include "lpc.h" | |
9110 | 27 #include "mathops.h" |
7595 | 28 |
29 #define DEFAULT_FRAME_SIZE 4096 | |
30 #define DEFAULT_SAMPLE_SIZE 16 | |
31 #define MAX_CHANNELS 8 | |
32 #define ALAC_EXTRADATA_SIZE 36 | |
33 #define ALAC_FRAME_HEADER_SIZE 55 | |
34 #define ALAC_FRAME_FOOTER_SIZE 3 | |
35 | |
36 #define ALAC_ESCAPE_CODE 0x1FF | |
37 #define ALAC_MAX_LPC_ORDER 30 | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
38 #define DEFAULT_MAX_PRED_ORDER 6 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
39 #define DEFAULT_MIN_PRED_ORDER 4 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
40 #define ALAC_MAX_LPC_PRECISION 9 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
41 #define ALAC_MAX_LPC_SHIFT 9 |
7595 | 42 |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
43 #define ALAC_CHMODE_LEFT_RIGHT 0 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
44 #define ALAC_CHMODE_LEFT_SIDE 1 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
45 #define ALAC_CHMODE_RIGHT_SIDE 2 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
46 #define ALAC_CHMODE_MID_SIDE 3 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
47 |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
48 typedef struct RiceContext { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
49 int history_mult; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
50 int initial_history; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
51 int k_modifier; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
52 int rice_modifier; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
53 } RiceContext; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
54 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
55 typedef struct LPCContext { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
56 int lpc_order; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
57 int lpc_coeff[ALAC_MAX_LPC_ORDER+1]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
58 int lpc_quant; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
59 } LPCContext; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
60 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
61 typedef struct AlacEncodeContext { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
62 int compression_level; |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
63 int min_prediction_order; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
64 int max_prediction_order; |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
65 int max_coded_frame_size; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
66 int write_sample_size; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
67 int32_t sample_buf[MAX_CHANNELS][DEFAULT_FRAME_SIZE]; |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
68 int32_t predictor_buf[DEFAULT_FRAME_SIZE]; |
7595 | 69 int interlacing_shift; |
70 int interlacing_leftweight; | |
71 PutBitContext pbctx; | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
72 RiceContext rc; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
73 LPCContext lpc[MAX_CHANNELS]; |
7595 | 74 DSPContext dspctx; |
75 AVCodecContext *avctx; | |
76 } AlacEncodeContext; | |
77 | |
78 | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
79 static void init_sample_buffers(AlacEncodeContext *s, int16_t *input_samples) |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
80 { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
81 int ch, i; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
82 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
83 for(ch=0;ch<s->avctx->channels;ch++) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
84 int16_t *sptr = input_samples + ch; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
85 for(i=0;i<s->avctx->frame_size;i++) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
86 s->sample_buf[ch][i] = *sptr; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
87 sptr += s->avctx->channels; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
88 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
89 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
90 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
91 |
7595 | 92 static void encode_scalar(AlacEncodeContext *s, int x, int k, int write_sample_size) |
93 { | |
94 int divisor, q, r; | |
95 | |
96 k = FFMIN(k, s->rc.k_modifier); | |
97 divisor = (1<<k) - 1; | |
98 q = x / divisor; | |
99 r = x % divisor; | |
100 | |
101 if(q > 8) { | |
102 // write escape code and sample value directly | |
103 put_bits(&s->pbctx, 9, ALAC_ESCAPE_CODE); | |
104 put_bits(&s->pbctx, write_sample_size, x); | |
105 } else { | |
106 if(q) | |
107 put_bits(&s->pbctx, q, (1<<q) - 1); | |
108 put_bits(&s->pbctx, 1, 0); | |
109 | |
110 if(k != 1) { | |
111 if(r > 0) | |
112 put_bits(&s->pbctx, k, r+1); | |
113 else | |
114 put_bits(&s->pbctx, k-1, 0); | |
115 } | |
116 } | |
117 } | |
118 | |
119 static void write_frame_header(AlacEncodeContext *s, int is_verbatim) | |
120 { | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
121 put_bits(&s->pbctx, 3, s->avctx->channels-1); // No. of channels -1 |
7595 | 122 put_bits(&s->pbctx, 16, 0); // Seems to be zero |
123 put_bits(&s->pbctx, 1, 1); // Sample count is in the header | |
124 put_bits(&s->pbctx, 2, 0); // FIXME: Wasted bytes field | |
125 put_bits(&s->pbctx, 1, is_verbatim); // Audio block is verbatim | |
126 put_bits(&s->pbctx, 32, s->avctx->frame_size); // No. of samples in the frame | |
127 } | |
128 | |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
129 static void calc_predictor_params(AlacEncodeContext *s, int ch) |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
130 { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
131 int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
132 int shift[MAX_LPC_ORDER]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
133 int opt_order; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
134 |
7618
2b023daf5329
alacenc: Use user-specified min and max prediction order.
ramiro
parents:
7617
diff
changeset
|
135 opt_order = ff_lpc_calc_coefs(&s->dspctx, s->sample_buf[ch], s->avctx->frame_size, s->min_prediction_order, s->max_prediction_order, |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
136 ALAC_MAX_LPC_PRECISION, coefs, shift, 1, ORDER_METHOD_EST, ALAC_MAX_LPC_SHIFT, 1); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
137 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
138 s->lpc[ch].lpc_order = opt_order; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
139 s->lpc[ch].lpc_quant = shift[opt_order-1]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
140 memcpy(s->lpc[ch].lpc_coeff, coefs[opt_order-1], opt_order*sizeof(int)); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
141 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
142 |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
143 static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n) |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
144 { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
145 int i, best; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
146 int32_t lt, rt; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
147 uint64_t sum[4]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
148 uint64_t score[4]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
149 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
150 /* calculate sum of 2nd order residual for each channel */ |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
151 sum[0] = sum[1] = sum[2] = sum[3] = 0; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
152 for(i=2; i<n; i++) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
153 lt = left_ch[i] - 2*left_ch[i-1] + left_ch[i-2]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
154 rt = right_ch[i] - 2*right_ch[i-1] + right_ch[i-2]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
155 sum[2] += FFABS((lt + rt) >> 1); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
156 sum[3] += FFABS(lt - rt); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
157 sum[0] += FFABS(lt); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
158 sum[1] += FFABS(rt); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
159 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
160 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
161 /* calculate score for each mode */ |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
162 score[0] = sum[0] + sum[1]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
163 score[1] = sum[0] + sum[3]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
164 score[2] = sum[1] + sum[3]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
165 score[3] = sum[2] + sum[3]; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
166 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
167 /* return mode with lowest score */ |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
168 best = 0; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
169 for(i=1; i<4; i++) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
170 if(score[i] < score[best]) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
171 best = i; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
172 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
173 } |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
174 return best; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
175 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
176 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
177 static void alac_stereo_decorrelation(AlacEncodeContext *s) |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
178 { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
179 int32_t *left = s->sample_buf[0], *right = s->sample_buf[1]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
180 int i, mode, n = s->avctx->frame_size; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
181 int32_t tmp; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
182 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
183 mode = estimate_stereo_mode(left, right, n); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
184 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
185 switch(mode) |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
186 { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
187 case ALAC_CHMODE_LEFT_RIGHT: |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
188 s->interlacing_leftweight = 0; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
189 s->interlacing_shift = 0; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
190 break; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
191 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
192 case ALAC_CHMODE_LEFT_SIDE: |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
193 for(i=0; i<n; i++) { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
194 right[i] = left[i] - right[i]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
195 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
196 s->interlacing_leftweight = 1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
197 s->interlacing_shift = 0; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
198 break; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
199 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
200 case ALAC_CHMODE_RIGHT_SIDE: |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
201 for(i=0; i<n; i++) { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
202 tmp = right[i]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
203 right[i] = left[i] - right[i]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
204 left[i] = tmp + (right[i] >> 31); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
205 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
206 s->interlacing_leftweight = 1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
207 s->interlacing_shift = 31; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
208 break; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
209 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
210 default: |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
211 for(i=0; i<n; i++) { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
212 tmp = left[i]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
213 left[i] = (tmp + right[i]) >> 1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
214 right[i] = tmp - right[i]; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
215 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
216 s->interlacing_leftweight = 1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
217 s->interlacing_shift = 1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
218 break; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
219 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
220 } |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
221 |
7619 | 222 static void alac_linear_predictor(AlacEncodeContext *s, int ch) |
223 { | |
224 int i; | |
225 LPCContext lpc = s->lpc[ch]; | |
226 | |
227 if(lpc.lpc_order == 31) { | |
228 s->predictor_buf[0] = s->sample_buf[ch][0]; | |
229 | |
230 for(i=1; i<s->avctx->frame_size; i++) | |
231 s->predictor_buf[i] = s->sample_buf[ch][i] - s->sample_buf[ch][i-1]; | |
232 | |
233 return; | |
234 } | |
235 | |
236 // generalised linear predictor | |
237 | |
238 if(lpc.lpc_order > 0) { | |
239 int32_t *samples = s->sample_buf[ch]; | |
240 int32_t *residual = s->predictor_buf; | |
241 | |
242 // generate warm-up samples | |
243 residual[0] = samples[0]; | |
244 for(i=1;i<=lpc.lpc_order;i++) | |
245 residual[i] = samples[i] - samples[i-1]; | |
246 | |
247 // perform lpc on remaining samples | |
248 for(i = lpc.lpc_order + 1; i < s->avctx->frame_size; i++) { | |
249 int sum = 1 << (lpc.lpc_quant - 1), res_val, j; | |
250 | |
251 for (j = 0; j < lpc.lpc_order; j++) { | |
252 sum += (samples[lpc.lpc_order-j] - samples[0]) * | |
253 lpc.lpc_coeff[j]; | |
254 } | |
255 | |
256 sum >>= lpc.lpc_quant; | |
257 sum += samples[0]; | |
9110 | 258 residual[i] = sign_extend(samples[lpc.lpc_order+1] - sum, |
259 s->write_sample_size); | |
7619 | 260 res_val = residual[i]; |
261 | |
262 if(res_val) { | |
263 int index = lpc.lpc_order - 1; | |
264 int neg = (res_val < 0); | |
265 | |
266 while(index >= 0 && (neg ? (res_val < 0):(res_val > 0))) { | |
267 int val = samples[0] - samples[lpc.lpc_order - index]; | |
268 int sign = (val ? FFSIGN(val) : 0); | |
269 | |
270 if(neg) | |
271 sign*=-1; | |
272 | |
273 lpc.lpc_coeff[index] -= sign; | |
274 val *= sign; | |
275 res_val -= ((val >> lpc.lpc_quant) * | |
276 (lpc.lpc_order - index)); | |
277 index--; | |
278 } | |
279 } | |
280 samples++; | |
281 } | |
282 } | |
283 } | |
284 | |
285 static void alac_entropy_coder(AlacEncodeContext *s) | |
286 { | |
287 unsigned int history = s->rc.initial_history; | |
288 int sign_modifier = 0, i, k; | |
289 int32_t *samples = s->predictor_buf; | |
290 | |
291 for(i=0;i < s->avctx->frame_size;) { | |
292 int x; | |
293 | |
294 k = av_log2((history >> 9) + 3); | |
295 | |
296 x = -2*(*samples)-1; | |
297 x ^= (x>>31); | |
298 | |
299 samples++; | |
300 i++; | |
301 | |
302 encode_scalar(s, x - sign_modifier, k, s->write_sample_size); | |
303 | |
304 history += x * s->rc.history_mult | |
305 - ((history * s->rc.history_mult) >> 9); | |
306 | |
307 sign_modifier = 0; | |
308 if(x > 0xFFFF) | |
309 history = 0xFFFF; | |
310 | |
311 if((history < 128) && (i < s->avctx->frame_size)) { | |
312 unsigned int block_size = 0; | |
313 | |
314 k = 7 - av_log2(history) + ((history + 16) >> 6); | |
315 | |
316 while((*samples == 0) && (i < s->avctx->frame_size)) { | |
317 samples++; | |
318 i++; | |
319 block_size++; | |
320 } | |
321 encode_scalar(s, block_size, k, 16); | |
322 | |
323 sign_modifier = (block_size <= 0xFFFF); | |
324 | |
325 history = 0; | |
326 } | |
327 | |
328 } | |
329 } | |
330 | |
7595 | 331 static void write_compressed_frame(AlacEncodeContext *s) |
332 { | |
333 int i, j; | |
334 | |
7659
b87a9296e854
alacenc : perform decorrelation only for stereo samples
jai_menon
parents:
7620
diff
changeset
|
335 if(s->avctx->channels == 2) |
b87a9296e854
alacenc : perform decorrelation only for stereo samples
jai_menon
parents:
7620
diff
changeset
|
336 alac_stereo_decorrelation(s); |
7595 | 337 put_bits(&s->pbctx, 8, s->interlacing_shift); |
338 put_bits(&s->pbctx, 8, s->interlacing_leftweight); | |
339 | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
340 for(i=0;i<s->avctx->channels;i++) { |
7595 | 341 |
342 calc_predictor_params(s, i); | |
343 | |
344 put_bits(&s->pbctx, 4, 0); // prediction type : currently only type 0 has been RE'd | |
345 put_bits(&s->pbctx, 4, s->lpc[i].lpc_quant); | |
346 | |
347 put_bits(&s->pbctx, 3, s->rc.rice_modifier); | |
348 put_bits(&s->pbctx, 5, s->lpc[i].lpc_order); | |
349 // predictor coeff. table | |
350 for(j=0;j<s->lpc[i].lpc_order;j++) { | |
351 put_sbits(&s->pbctx, 16, s->lpc[i].lpc_coeff[j]); | |
352 } | |
353 } | |
354 | |
355 // apply lpc and entropy coding to audio samples | |
356 | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
357 for(i=0;i<s->avctx->channels;i++) { |
7595 | 358 alac_linear_predictor(s, i); |
359 alac_entropy_coder(s); | |
360 } | |
361 } | |
362 | |
363 static av_cold int alac_encode_init(AVCodecContext *avctx) | |
364 { | |
365 AlacEncodeContext *s = avctx->priv_data; | |
366 uint8_t *alac_extradata = av_mallocz(ALAC_EXTRADATA_SIZE+1); | |
367 | |
368 avctx->frame_size = DEFAULT_FRAME_SIZE; | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7659
diff
changeset
|
369 avctx->bits_per_coded_sample = DEFAULT_SAMPLE_SIZE; |
7595 | 370 |
371 if(avctx->sample_fmt != SAMPLE_FMT_S16) { | |
372 av_log(avctx, AV_LOG_ERROR, "only pcm_s16 input samples are supported\n"); | |
373 return -1; | |
374 } | |
375 | |
376 // Set default compression level | |
377 if(avctx->compression_level == FF_COMPRESSION_DEFAULT) | |
378 s->compression_level = 1; | |
379 else | |
380 s->compression_level = av_clip(avctx->compression_level, 0, 1); | |
381 | |
382 // Initialize default Rice parameters | |
383 s->rc.history_mult = 40; | |
384 s->rc.initial_history = 10; | |
385 s->rc.k_modifier = 14; | |
386 s->rc.rice_modifier = 4; | |
387 | |
388 s->max_coded_frame_size = (ALAC_FRAME_HEADER_SIZE + ALAC_FRAME_FOOTER_SIZE + | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7659
diff
changeset
|
389 avctx->frame_size*avctx->channels*avctx->bits_per_coded_sample)>>3; |
7595 | 390 |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7659
diff
changeset
|
391 s->write_sample_size = avctx->bits_per_coded_sample + avctx->channels - 1; // FIXME: consider wasted_bytes |
7595 | 392 |
393 AV_WB32(alac_extradata, ALAC_EXTRADATA_SIZE); | |
394 AV_WB32(alac_extradata+4, MKBETAG('a','l','a','c')); | |
395 AV_WB32(alac_extradata+12, avctx->frame_size); | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7659
diff
changeset
|
396 AV_WB8 (alac_extradata+17, avctx->bits_per_coded_sample); |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
397 AV_WB8 (alac_extradata+21, avctx->channels); |
7595 | 398 AV_WB32(alac_extradata+24, s->max_coded_frame_size); |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7659
diff
changeset
|
399 AV_WB32(alac_extradata+28, avctx->sample_rate*avctx->channels*avctx->bits_per_coded_sample); // average bitrate |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
400 AV_WB32(alac_extradata+32, avctx->sample_rate); |
7595 | 401 |
402 // Set relevant extradata fields | |
403 if(s->compression_level > 0) { | |
404 AV_WB8(alac_extradata+18, s->rc.history_mult); | |
405 AV_WB8(alac_extradata+19, s->rc.initial_history); | |
406 AV_WB8(alac_extradata+20, s->rc.k_modifier); | |
407 } | |
408 | |
7619 | 409 s->min_prediction_order = DEFAULT_MIN_PRED_ORDER; |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
410 if(avctx->min_prediction_order >= 0) { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
411 if(avctx->min_prediction_order < MIN_LPC_ORDER || |
7620
5c2299115d1f
alacenc: compare against ALAC_MAX_LPC_ORDER instead of MAX_LPC_ORDER
jai_menon
parents:
7619
diff
changeset
|
412 avctx->min_prediction_order > ALAC_MAX_LPC_ORDER) { |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
413 av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n", avctx->min_prediction_order); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
414 return -1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
415 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
416 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
417 s->min_prediction_order = avctx->min_prediction_order; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
418 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
419 |
7619 | 420 s->max_prediction_order = DEFAULT_MAX_PRED_ORDER; |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
421 if(avctx->max_prediction_order >= 0) { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
422 if(avctx->max_prediction_order < MIN_LPC_ORDER || |
7620
5c2299115d1f
alacenc: compare against ALAC_MAX_LPC_ORDER instead of MAX_LPC_ORDER
jai_menon
parents:
7619
diff
changeset
|
423 avctx->max_prediction_order > ALAC_MAX_LPC_ORDER) { |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
424 av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n", avctx->max_prediction_order); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
425 return -1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
426 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
427 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
428 s->max_prediction_order = avctx->max_prediction_order; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
429 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
430 |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
431 if(s->max_prediction_order < s->min_prediction_order) { |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
432 av_log(avctx, AV_LOG_ERROR, "invalid prediction orders: min=%d max=%d\n", |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
433 s->min_prediction_order, s->max_prediction_order); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
434 return -1; |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
435 } |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
436 |
7595 | 437 avctx->extradata = alac_extradata; |
438 avctx->extradata_size = ALAC_EXTRADATA_SIZE; | |
439 | |
440 avctx->coded_frame = avcodec_alloc_frame(); | |
441 avctx->coded_frame->key_frame = 1; | |
442 | |
443 s->avctx = avctx; | |
444 dsputil_init(&s->dspctx, avctx); | |
445 | |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
446 return 0; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
447 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
448 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
449 static int alac_encode_frame(AVCodecContext *avctx, uint8_t *frame, |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
450 int buf_size, void *data) |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
451 { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
452 AlacEncodeContext *s = avctx->priv_data; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
453 PutBitContext *pb = &s->pbctx; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
454 int i, out_bytes, verbatim_flag = 0; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
455 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
456 if(avctx->frame_size > DEFAULT_FRAME_SIZE) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
457 av_log(avctx, AV_LOG_ERROR, "input frame size exceeded\n"); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
458 return -1; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
459 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
460 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
461 if(buf_size < 2*s->max_coded_frame_size) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
462 av_log(avctx, AV_LOG_ERROR, "buffer size is too small\n"); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
463 return -1; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
464 } |
7595 | 465 |
7617
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
466 verbatim: |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
467 init_put_bits(pb, frame, buf_size); |
924dc060db81
Import more OKed parts of ALAC encoder from GSoC repo.
ramiro
parents:
7604
diff
changeset
|
468 |
7604
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
469 if((s->compression_level == 0) || verbatim_flag) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
470 // Verbatim mode |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
471 int16_t *samples = data; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
472 write_frame_header(s, 1); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
473 for(i=0; i<avctx->frame_size*avctx->channels; i++) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
474 put_sbits(pb, 16, *samples++); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
475 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
476 } else { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
477 init_sample_buffers(s, data); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
478 write_frame_header(s, 0); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
479 write_compressed_frame(s); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
480 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
481 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
482 put_bits(pb, 3, 7); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
483 flush_put_bits(pb); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
484 out_bytes = put_bits_count(pb) >> 3; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
485 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
486 if(out_bytes > s->max_coded_frame_size) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
487 /* frame too large. use verbatim mode */ |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
488 if(verbatim_flag || (s->compression_level == 0)) { |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
489 /* still too large. must be an error. */ |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
490 av_log(avctx, AV_LOG_ERROR, "error encoding frame\n"); |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
491 return -1; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
492 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
493 verbatim_flag = 1; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
494 goto verbatim; |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
495 } |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
496 |
6250ff63990b
Import more ok'd parts of ALAC encoder from GSoC repo.
ramiro
parents:
7598
diff
changeset
|
497 return out_bytes; |
7595 | 498 } |
499 | |
500 static av_cold int alac_encode_close(AVCodecContext *avctx) | |
501 { | |
502 av_freep(&avctx->extradata); | |
503 avctx->extradata_size = 0; | |
504 av_freep(&avctx->coded_frame); | |
505 return 0; | |
506 } | |
507 | |
508 AVCodec alac_encoder = { | |
509 "alac", | |
510 CODEC_TYPE_AUDIO, | |
511 CODEC_ID_ALAC, | |
512 sizeof(AlacEncodeContext), | |
513 alac_encode_init, | |
514 alac_encode_frame, | |
515 alac_encode_close, | |
516 .capabilities = CODEC_CAP_SMALL_LAST_FRAME, | |
7598 | 517 .long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"), |
7595 | 518 }; |