annotate flacenc.c @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents e59926e2c50c
children dde20597f15e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1 /**
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
2 * FLAC audio encoder
7594
cd6217c9ce92 update my email address to one which does not depend on my service provider
jbr
parents: 7592
diff changeset
3 * Copyright (c) 2006 Justin Ruggles <justin.ruggles@gmail.com>
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3481
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3481
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3481
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3481
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3481
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
16 *
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3481
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
20 */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
21
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 6710
diff changeset
22 #include "libavutil/crc.h"
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
23 #include "libavutil/md5.h"
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
24 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9216
diff changeset
25 #include "get_bits.h"
5737
efa3c1f9259a sse2 version of compute_autocorr().
lorenm
parents: 5733
diff changeset
26 #include "dsputil.h"
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
27 #include "golomb.h"
7589
8b695a99e8df flacenc, lpc: Move LPC code from flacenc.c to new lpc.[ch] files.
ramiro
parents: 7588
diff changeset
28 #include "lpc.h"
9188
f534d0cca450 share some constants between the FLAC encoder and FLAC decoder
jbr
parents: 8590
diff changeset
29 #include "flac.h"
9213
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
30 #include "flacdata.h"
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
31
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
32 #define FLAC_SUBFRAME_CONSTANT 0
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
33 #define FLAC_SUBFRAME_VERBATIM 1
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
34 #define FLAC_SUBFRAME_FIXED 8
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
35 #define FLAC_SUBFRAME_LPC 32
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
36
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
37 #define MAX_FIXED_ORDER 4
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
38 #define MAX_PARTITION_ORDER 8
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
39 #define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER)
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
40 #define MAX_LPC_PRECISION 15
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
41 #define MAX_LPC_SHIFT 15
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
42 #define MAX_RICE_PARAM 14
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
43
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
44 typedef struct CompressionOptions {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
45 int compression_level;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
46 int block_time_ms;
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
47 enum AVLPCType lpc_type;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
48 int lpc_passes;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
49 int lpc_coeff_precision;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
50 int min_prediction_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
51 int max_prediction_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
52 int prediction_order_method;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
53 int min_partition_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
54 int max_partition_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
55 } CompressionOptions;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
56
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
57 typedef struct RiceContext {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
58 int porder;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
59 int params[MAX_PARTITIONS];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
60 } RiceContext;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
61
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
62 typedef struct FlacSubframe {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
63 int type;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
64 int type_code;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
65 int obits;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
66 int order;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
67 int32_t coefs[MAX_LPC_ORDER];
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
68 int shift;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
69 RiceContext rc;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
70 int32_t samples[FLAC_MAX_BLOCKSIZE];
5722
d1707b860013 oops, potential overflow on really large blocks
lorenm
parents: 5720
diff changeset
71 int32_t residual[FLAC_MAX_BLOCKSIZE+1];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
72 } FlacSubframe;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
73
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
74 typedef struct FlacFrame {
9188
f534d0cca450 share some constants between the FLAC encoder and FLAC decoder
jbr
parents: 8590
diff changeset
75 FlacSubframe subframes[FLAC_MAX_CHANNELS];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
76 int blocksize;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
77 int bs_code[2];
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
78 uint8_t crc8;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
79 int ch_mode;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
80 } FlacFrame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
81
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
82 typedef struct FlacEncodeContext {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
83 PutBitContext pb;
9214
78b55e071bb9 revert accidental unrelated change in last commit
jbr
parents: 9213
diff changeset
84 int channels;
78b55e071bb9 revert accidental unrelated change in last commit
jbr
parents: 9213
diff changeset
85 int samplerate;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
86 int sr_code[2];
9448
f2835afa516a flacenc: write initial blocksize to STREAMINFO header instead of current
jbr
parents: 9432
diff changeset
87 int max_blocksize;
7864
4820bd751284 write actual min and max frame size to FLAC header. update regression test checksum.
jbr
parents: 7861
diff changeset
88 int min_framesize;
9214
78b55e071bb9 revert accidental unrelated change in last commit
jbr
parents: 9213
diff changeset
89 int max_framesize;
7864
4820bd751284 write actual min and max frame size to FLAC header. update regression test checksum.
jbr
parents: 7861
diff changeset
90 int max_encoded_framesize;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
91 uint32_t frame_count;
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
92 uint64_t sample_count;
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
93 uint8_t md5sum[16];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
94 FlacFrame frame;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
95 CompressionOptions options;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
96 AVCodecContext *avctx;
5737
efa3c1f9259a sse2 version of compute_autocorr().
lorenm
parents: 5733
diff changeset
97 DSPContext dsp;
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
98 struct AVMD5 *md5ctx;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
99 } FlacEncodeContext;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
100
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
101 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11936
diff changeset
102 * Write streaminfo metadata block to byte array
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
103 */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
104 static void write_streaminfo(FlacEncodeContext *s, uint8_t *header)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
105 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
106 PutBitContext pb;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
107
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
108 memset(header, 0, FLAC_STREAMINFO_SIZE);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
109 init_put_bits(&pb, header, FLAC_STREAMINFO_SIZE);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
110
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
111 /* streaminfo metadata block */
9448
f2835afa516a flacenc: write initial blocksize to STREAMINFO header instead of current
jbr
parents: 9432
diff changeset
112 put_bits(&pb, 16, s->max_blocksize);
f2835afa516a flacenc: write initial blocksize to STREAMINFO header instead of current
jbr
parents: 9432
diff changeset
113 put_bits(&pb, 16, s->max_blocksize);
7864
4820bd751284 write actual min and max frame size to FLAC header. update regression test checksum.
jbr
parents: 7861
diff changeset
114 put_bits(&pb, 24, s->min_framesize);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
115 put_bits(&pb, 24, s->max_framesize);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
116 put_bits(&pb, 20, s->samplerate);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
117 put_bits(&pb, 3, s->channels-1);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
118 put_bits(&pb, 5, 15); /* bits per sample - 1 */
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
119 /* write 36-bit sample count in 2 put_bits() calls */
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
120 put_bits(&pb, 24, (s->sample_count & 0xFFFFFF000LL) >> 12);
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
121 put_bits(&pb, 12, s->sample_count & 0x000000FFFLL);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
122 flush_put_bits(&pb);
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
123 memcpy(&header[18], s->md5sum, 16);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
124 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
125
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
126 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11936
diff changeset
127 * Set blocksize based on samplerate
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11936
diff changeset
128 * Choose the closest predefined blocksize >= BLOCK_TIME_MS milliseconds
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
129 */
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
130 static int select_blocksize(int samplerate, int block_time_ms)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
131 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
132 int i;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
133 int target;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
134 int blocksize;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
135
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
136 assert(samplerate > 0);
9213
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
137 blocksize = ff_flac_blocksize_table[1];
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
138 target = (samplerate * block_time_ms) / 1000;
3354
ba80e4de976b simplify & optimize things a little
michael
parents: 3353
diff changeset
139 for(i=0; i<16; i++) {
9213
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
140 if(target >= ff_flac_blocksize_table[i] && ff_flac_blocksize_table[i] > blocksize) {
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
141 blocksize = ff_flac_blocksize_table[i];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
142 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
143 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
144 return blocksize;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
145 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
146
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6341
diff changeset
147 static av_cold int flac_encode_init(AVCodecContext *avctx)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
148 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
149 int freq = avctx->sample_rate;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
150 int channels = avctx->channels;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
151 FlacEncodeContext *s = avctx->priv_data;
3386
1b2a9377ff0d simplify
michael
parents: 3385
diff changeset
152 int i, level;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
153 uint8_t *streaminfo;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
154
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
155 s->avctx = avctx;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
156
5737
efa3c1f9259a sse2 version of compute_autocorr().
lorenm
parents: 5733
diff changeset
157 dsputil_init(&s->dsp, avctx);
efa3c1f9259a sse2 version of compute_autocorr().
lorenm
parents: 5733
diff changeset
158
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
159 if(avctx->sample_fmt != SAMPLE_FMT_S16) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
160 return -1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
161 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
162
9188
f534d0cca450 share some constants between the FLAC encoder and FLAC decoder
jbr
parents: 8590
diff changeset
163 if(channels < 1 || channels > FLAC_MAX_CHANNELS) {
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
164 return -1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
165 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
166 s->channels = channels;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
167
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
168 /* find samplerate in table */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
169 if(freq < 1)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
170 return -1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
171 for(i=4; i<12; i++) {
9213
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
172 if(freq == ff_flac_sample_rate_table[i]) {
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
173 s->samplerate = ff_flac_sample_rate_table[i];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
174 s->sr_code[0] = i;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
175 s->sr_code[1] = 0;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
176 break;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
177 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
178 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
179 /* if not in table, samplerate is non-standard */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
180 if(i == 12) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
181 if(freq % 1000 == 0 && freq < 255000) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
182 s->sr_code[0] = 12;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
183 s->sr_code[1] = freq / 1000;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
184 } else if(freq % 10 == 0 && freq < 655350) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
185 s->sr_code[0] = 14;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
186 s->sr_code[1] = freq / 10;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
187 } else if(freq < 65535) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
188 s->sr_code[0] = 13;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
189 s->sr_code[1] = freq;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
190 } else {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
191 return -1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
192 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
193 s->samplerate = freq;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
194 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
195
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
196 /* set compression option defaults based on avctx->compression_level */
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
197 if(avctx->compression_level < 0) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
198 s->options.compression_level = 5;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
199 } else {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
200 s->options.compression_level = avctx->compression_level;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
201 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
202 av_log(avctx, AV_LOG_DEBUG, " compression: %d\n", s->options.compression_level);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
203
3386
1b2a9377ff0d simplify
michael
parents: 3385
diff changeset
204 level= s->options.compression_level;
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
205 if(level > 12) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
206 av_log(avctx, AV_LOG_ERROR, "invalid compression level: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
207 s->options.compression_level);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
208 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
209 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
210
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
211 s->options.block_time_ms = ((int[]){ 27, 27, 27,105,105,105,105,105,105,105,105,105,105})[level];
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
212 s->options.lpc_type = ((int[]){ AV_LPC_TYPE_FIXED, AV_LPC_TYPE_FIXED, AV_LPC_TYPE_FIXED,
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
213 AV_LPC_TYPE_LEVINSON, AV_LPC_TYPE_LEVINSON, AV_LPC_TYPE_LEVINSON,
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
214 AV_LPC_TYPE_LEVINSON, AV_LPC_TYPE_LEVINSON, AV_LPC_TYPE_LEVINSON,
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
215 AV_LPC_TYPE_LEVINSON, AV_LPC_TYPE_LEVINSON, AV_LPC_TYPE_LEVINSON,
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
216 AV_LPC_TYPE_LEVINSON})[level];
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
217 s->options.min_prediction_order= ((int[]){ 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1})[level];
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
218 s->options.max_prediction_order= ((int[]){ 3, 4, 4, 6, 8, 8, 8, 8, 12, 12, 12, 32, 32})[level];
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
219 s->options.prediction_order_method = ((int[]){ ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST,
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
220 ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST,
3480
9eb59c4a22d2 Modify preset compression levels to utilize log search.
jbr
parents: 3478
diff changeset
221 ORDER_METHOD_4LEVEL, ORDER_METHOD_LOG, ORDER_METHOD_4LEVEL,
9eb59c4a22d2 Modify preset compression levels to utilize log search.
jbr
parents: 3478
diff changeset
222 ORDER_METHOD_LOG, ORDER_METHOD_SEARCH, ORDER_METHOD_LOG,
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
223 ORDER_METHOD_SEARCH})[level];
3481
f51065637305 cosmetic change to adjust alignment.
jbr
parents: 3480
diff changeset
224 s->options.min_partition_order = ((int[]){ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})[level];
f51065637305 cosmetic change to adjust alignment.
jbr
parents: 3480
diff changeset
225 s->options.max_partition_order = ((int[]){ 2, 2, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8})[level];
3386
1b2a9377ff0d simplify
michael
parents: 3385
diff changeset
226
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
227 /* set compression option overrides from AVCodecContext */
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
228 #if LIBAVCODEC_VERSION_MAJOR < 53
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
229 /* for compatibility with deprecated AVCodecContext.use_lpc */
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
230 if (avctx->use_lpc == 0) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
231 s->options.lpc_type = AV_LPC_TYPE_FIXED;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
232 } else if (avctx->use_lpc == 1) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
233 s->options.lpc_type = AV_LPC_TYPE_LEVINSON;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
234 } else if (avctx->use_lpc > 1) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
235 s->options.lpc_type = AV_LPC_TYPE_CHOLESKY;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
236 s->options.lpc_passes = avctx->use_lpc - 1;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
237 }
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
238 #endif
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
239 if (avctx->lpc_type > AV_LPC_TYPE_DEFAULT) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
240 if (avctx->lpc_type > AV_LPC_TYPE_CHOLESKY) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
241 av_log(avctx, AV_LOG_ERROR, "unknown lpc type: %d\n", avctx->lpc_type);
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
242 return -1;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
243 }
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
244 s->options.lpc_type = avctx->lpc_type;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
245 if (s->options.lpc_type == AV_LPC_TYPE_CHOLESKY) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
246 if (avctx->lpc_passes < 0) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
247 // default number of passes for Cholesky
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
248 s->options.lpc_passes = 2;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
249 } else if (avctx->lpc_passes == 0) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
250 av_log(avctx, AV_LOG_ERROR, "invalid number of lpc passes: %d\n",
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
251 avctx->lpc_passes);
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
252 return -1;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
253 } else {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
254 s->options.lpc_passes = avctx->lpc_passes;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
255 }
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
256 }
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
257 }
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
258 switch (s->options.lpc_type) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
259 case AV_LPC_TYPE_NONE:
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
260 av_log(avctx, AV_LOG_DEBUG, " lpc type: None\n");
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
261 break;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
262 case AV_LPC_TYPE_FIXED:
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
263 av_log(avctx, AV_LOG_DEBUG, " lpc type: Fixed pre-defined coefficients\n");
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
264 break;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
265 case AV_LPC_TYPE_LEVINSON:
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
266 av_log(avctx, AV_LOG_DEBUG, " lpc type: Levinson-Durbin recursion with Welch window\n");
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
267 break;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
268 case AV_LPC_TYPE_CHOLESKY:
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
269 av_log(avctx, AV_LOG_DEBUG, " lpc type: Cholesky factorization, %d pass%s\n",
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
270 s->options.lpc_passes, s->options.lpc_passes==1?"":"es");
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
271 break;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
272 }
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
273
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
274 if (s->options.lpc_type == AV_LPC_TYPE_NONE) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
275 s->options.min_prediction_order = 0;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
276 } else if (avctx->min_prediction_order >= 0) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
277 if (s->options.lpc_type == AV_LPC_TYPE_FIXED) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
278 if(avctx->min_prediction_order > MAX_FIXED_ORDER) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
279 av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
280 avctx->min_prediction_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
281 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
282 }
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
283 } else if(avctx->min_prediction_order < MIN_LPC_ORDER ||
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
284 avctx->min_prediction_order > MAX_LPC_ORDER) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
285 av_log(avctx, AV_LOG_ERROR, "invalid min prediction order: %d\n",
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
286 avctx->min_prediction_order);
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
287 return -1;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
288 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
289 s->options.min_prediction_order = avctx->min_prediction_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
290 }
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
291 if (s->options.lpc_type == AV_LPC_TYPE_NONE) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
292 s->options.max_prediction_order = 0;
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
293 } else if (avctx->max_prediction_order >= 0) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
294 if (s->options.lpc_type == AV_LPC_TYPE_FIXED) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
295 if(avctx->max_prediction_order > MAX_FIXED_ORDER) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
296 av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
297 avctx->max_prediction_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
298 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
299 }
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
300 } else if (avctx->max_prediction_order < MIN_LPC_ORDER ||
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
301 avctx->max_prediction_order > MAX_LPC_ORDER) {
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
302 av_log(avctx, AV_LOG_ERROR, "invalid max prediction order: %d\n",
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
303 avctx->max_prediction_order);
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
304 return -1;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
305 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
306 s->options.max_prediction_order = avctx->max_prediction_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
307 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
308 if(s->options.max_prediction_order < s->options.min_prediction_order) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
309 av_log(avctx, AV_LOG_ERROR, "invalid prediction orders: min=%d max=%d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
310 s->options.min_prediction_order, s->options.max_prediction_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
311 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
312 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
313 av_log(avctx, AV_LOG_DEBUG, " prediction order: %d, %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
314 s->options.min_prediction_order, s->options.max_prediction_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
315
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
316 if(avctx->prediction_order_method >= 0) {
3478
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
317 if(avctx->prediction_order_method > ORDER_METHOD_LOG) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
318 av_log(avctx, AV_LOG_ERROR, "invalid prediction order method: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
319 avctx->prediction_order_method);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
320 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
321 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
322 s->options.prediction_order_method = avctx->prediction_order_method;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
323 }
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
324 switch(s->options.prediction_order_method) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
325 case ORDER_METHOD_EST: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
326 "estimate"); break;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
327 case ORDER_METHOD_2LEVEL: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
328 "2-level"); break;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
329 case ORDER_METHOD_4LEVEL: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
330 "4-level"); break;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
331 case ORDER_METHOD_8LEVEL: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
332 "8-level"); break;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
333 case ORDER_METHOD_SEARCH: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
334 "full search"); break;
3478
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
335 case ORDER_METHOD_LOG: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n",
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
336 "log search"); break;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
337 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
338
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
339 if(avctx->min_partition_order >= 0) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
340 if(avctx->min_partition_order > MAX_PARTITION_ORDER) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
341 av_log(avctx, AV_LOG_ERROR, "invalid min partition order: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
342 avctx->min_partition_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
343 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
344 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
345 s->options.min_partition_order = avctx->min_partition_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
346 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
347 if(avctx->max_partition_order >= 0) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
348 if(avctx->max_partition_order > MAX_PARTITION_ORDER) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
349 av_log(avctx, AV_LOG_ERROR, "invalid max partition order: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
350 avctx->max_partition_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
351 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
352 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
353 s->options.max_partition_order = avctx->max_partition_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
354 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
355 if(s->options.max_partition_order < s->options.min_partition_order) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
356 av_log(avctx, AV_LOG_ERROR, "invalid partition orders: min=%d max=%d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
357 s->options.min_partition_order, s->options.max_partition_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
358 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
359 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
360 av_log(avctx, AV_LOG_DEBUG, " partition order: %d, %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
361 s->options.min_partition_order, s->options.max_partition_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
362
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
363 if(avctx->frame_size > 0) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
364 if(avctx->frame_size < FLAC_MIN_BLOCKSIZE ||
3442
5d133e59ecf2 allows user-settable block size and fixes related typo
jbr
parents: 3397
diff changeset
365 avctx->frame_size > FLAC_MAX_BLOCKSIZE) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
366 av_log(avctx, AV_LOG_ERROR, "invalid block size: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
367 avctx->frame_size);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
368 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
369 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
370 } else {
6548
28e34d24b3f7 remove redundant context variable
jbr
parents: 6545
diff changeset
371 s->avctx->frame_size = select_blocksize(s->samplerate, s->options.block_time_ms);
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
372 }
9448
f2835afa516a flacenc: write initial blocksize to STREAMINFO header instead of current
jbr
parents: 9432
diff changeset
373 s->max_blocksize = s->avctx->frame_size;
6548
28e34d24b3f7 remove redundant context variable
jbr
parents: 6545
diff changeset
374 av_log(avctx, AV_LOG_DEBUG, " block size: %d\n", s->avctx->frame_size);
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
375
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
376 /* set LPC precision */
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
377 if(avctx->lpc_coeff_precision > 0) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
378 if(avctx->lpc_coeff_precision > MAX_LPC_PRECISION) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
379 av_log(avctx, AV_LOG_ERROR, "invalid lpc coeff precision: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
380 avctx->lpc_coeff_precision);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
381 return -1;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
382 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
383 s->options.lpc_coeff_precision = avctx->lpc_coeff_precision;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
384 } else {
6545
85acd5166cf8 Use 15-bit LPC precision by default. This generally gives better compression
jbr
parents: 6517
diff changeset
385 /* default LPC precision */
85acd5166cf8 Use 15-bit LPC precision by default. This generally gives better compression
jbr
parents: 6517
diff changeset
386 s->options.lpc_coeff_precision = 15;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
387 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
388 av_log(avctx, AV_LOG_DEBUG, " lpc precision: %d\n",
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
389 s->options.lpc_coeff_precision);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
390
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
391 /* set maximum encoded frame size in verbatim mode */
9216
64246d9e583a add a function to calculate a more accurate estimate for maximum FLAC
jbr
parents: 9214
diff changeset
392 s->max_framesize = ff_flac_get_max_frame_size(s->avctx->frame_size,
64246d9e583a add a function to calculate a more accurate estimate for maximum FLAC
jbr
parents: 9214
diff changeset
393 s->channels, 16);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
394
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
395 /* initialize MD5 context */
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
396 s->md5ctx = av_malloc(av_md5_size);
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
397 if(!s->md5ctx)
11581
998691d7f8f5 Replace all remaining occurrences of AVERROR_NOMEM with
stefano
parents: 11560
diff changeset
398 return AVERROR(ENOMEM);
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
399 av_md5_init(s->md5ctx);
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
400
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
401 streaminfo = av_malloc(FLAC_STREAMINFO_SIZE);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
402 write_streaminfo(s, streaminfo);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
403 avctx->extradata = streaminfo;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
404 avctx->extradata_size = FLAC_STREAMINFO_SIZE;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
405
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
406 s->frame_count = 0;
9212
c7a8e302b98a flacenc: remove unneeded variable, 'min_encoded_framesize' and use
jbr
parents: 9209
diff changeset
407 s->min_framesize = s->max_framesize;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
408
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
409 avctx->coded_frame = avcodec_alloc_frame();
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
410 avctx->coded_frame->key_frame = 1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
411
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
412 return 0;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
413 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
414
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
415 static void init_frame(FlacEncodeContext *s)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
416 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
417 int i, ch;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
418 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
419
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
420 frame = &s->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
421
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
422 for(i=0; i<16; i++) {
9213
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
423 if(s->avctx->frame_size == ff_flac_blocksize_table[i]) {
782d31263979 share sample rate and blocksize tables between the FLAC encoder and FLAC
jbr
parents: 9212
diff changeset
424 frame->blocksize = ff_flac_blocksize_table[i];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
425 frame->bs_code[0] = i;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
426 frame->bs_code[1] = 0;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
427 break;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
428 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
429 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
430 if(i == 16) {
6548
28e34d24b3f7 remove redundant context variable
jbr
parents: 6545
diff changeset
431 frame->blocksize = s->avctx->frame_size;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
432 if(frame->blocksize <= 256) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
433 frame->bs_code[0] = 6;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
434 frame->bs_code[1] = frame->blocksize-1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
435 } else {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
436 frame->bs_code[0] = 7;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
437 frame->bs_code[1] = frame->blocksize-1;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
438 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
439 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
440
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
441 for(ch=0; ch<s->channels; ch++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
442 frame->subframes[ch].obits = 16;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
443 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
444 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
445
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
446 /**
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
447 * Copy channel-interleaved input samples into separate subframes
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
448 */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
449 static void copy_samples(FlacEncodeContext *s, int16_t *samples)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
450 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
451 int i, j, ch;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
452 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
453
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
454 frame = &s->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
455 for(i=0,j=0; i<frame->blocksize; i++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
456 for(ch=0; ch<s->channels; ch++,j++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
457 frame->subframes[ch].samples[i] = samples[j];
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
458 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
459 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
460 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
461
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
462
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
463 #define rice_encode_count(sum, n, k) (((n)*((k)+1))+((sum-(n>>1))>>(k)))
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
464
5732
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
465 /**
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
466 * Solve for d/dk(rice_encode_count) = n-((sum-(n>>1))>>(k+1)) = 0
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
467 */
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
468 static int find_optimal_param(uint32_t sum, int n)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
469 {
5732
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
470 int k;
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
471 uint32_t sum2;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
472
5732
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
473 if(sum <= n>>1)
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
474 return 0;
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
475 sum2 = sum-(n>>1);
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
476 k = av_log2(n<256 ? FASTDIV(sum2,n) : sum2/n);
d6fc148d1a48 replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents: 5731
diff changeset
477 return FFMIN(k, MAX_RICE_PARAM);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
478 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
479
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
480 static uint32_t calc_optimal_rice_params(RiceContext *rc, int porder,
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
481 uint32_t *sums, int n, int pred_order)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
482 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
483 int i;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
484 int k, cnt, part;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
485 uint32_t all_bits;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
486
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
487 part = (1 << porder);
5852
66317285d195 remove a branch from an inner loop.
lorenm
parents: 5743
diff changeset
488 all_bits = 4 * part;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
489
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
490 cnt = (n >> porder) - pred_order;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
491 for(i=0; i<part; i++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
492 k = find_optimal_param(sums[i], cnt);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
493 rc->params[i] = k;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
494 all_bits += rice_encode_count(sums[i], cnt, k);
5852
66317285d195 remove a branch from an inner loop.
lorenm
parents: 5743
diff changeset
495 cnt = n >> porder;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
496 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
497
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
498 rc->porder = porder;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
499
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
500 return all_bits;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
501 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
502
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
503 static void calc_sums(int pmin, int pmax, uint32_t *data, int n, int pred_order,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
504 uint32_t sums[][MAX_PARTITIONS])
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
505 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
506 int i, j;
3384
573fed4bf20f simplify
michael
parents: 3365
diff changeset
507 int parts;
573fed4bf20f simplify
michael
parents: 3365
diff changeset
508 uint32_t *res, *res_end;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
509
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
510 /* sums for highest level */
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
511 parts = (1 << pmax);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
512 res = &data[pred_order];
3384
573fed4bf20f simplify
michael
parents: 3365
diff changeset
513 res_end = &data[n >> pmax];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
514 for(i=0; i<parts; i++) {
5731
976b4c5e68bb gcc isn't smart enough to factor out duplicate stores
lorenm
parents: 5729
diff changeset
515 uint32_t sum = 0;
3384
573fed4bf20f simplify
michael
parents: 3365
diff changeset
516 while(res < res_end){
5731
976b4c5e68bb gcc isn't smart enough to factor out duplicate stores
lorenm
parents: 5729
diff changeset
517 sum += *(res++);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
518 }
5731
976b4c5e68bb gcc isn't smart enough to factor out duplicate stores
lorenm
parents: 5729
diff changeset
519 sums[pmax][i] = sum;
3384
573fed4bf20f simplify
michael
parents: 3365
diff changeset
520 res_end+= n >> pmax;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
521 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
522 /* sums for lower levels */
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
523 for(i=pmax-1; i>=pmin; i--) {
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
524 parts = (1 << i);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
525 for(j=0; j<parts; j++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
526 sums[i][j] = sums[i+1][2*j] + sums[i+1][2*j+1];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
527 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
528 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
529 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
530
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
531 static uint32_t calc_rice_params(RiceContext *rc, int pmin, int pmax,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
532 int32_t *data, int n, int pred_order)
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
533 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
534 int i;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
535 uint32_t bits[MAX_PARTITION_ORDER+1];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
536 int opt_porder;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
537 RiceContext tmp_rc;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
538 uint32_t *udata;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
539 uint32_t sums[MAX_PARTITION_ORDER+1][MAX_PARTITIONS];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
540
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
541 assert(pmin >= 0 && pmin <= MAX_PARTITION_ORDER);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
542 assert(pmax >= 0 && pmax <= MAX_PARTITION_ORDER);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
543 assert(pmin <= pmax);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
544
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
545 udata = av_malloc(n * sizeof(uint32_t));
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
546 for(i=0; i<n; i++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
547 udata[i] = (2*data[i]) ^ (data[i]>>31);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
548 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
549
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
550 calc_sums(pmin, pmax, udata, n, pred_order, sums);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
551
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
552 opt_porder = pmin;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
553 bits[pmin] = UINT32_MAX;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
554 for(i=pmin; i<=pmax; i++) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
555 bits[i] = calc_optimal_rice_params(&tmp_rc, i, sums[i], n, pred_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
556 if(bits[i] <= bits[opt_porder]) {
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
557 opt_porder = i;
3387
92fabe8c1422 dont use memcpy for copying structs
michael
parents: 3386
diff changeset
558 *rc= tmp_rc;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
559 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
560 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
561
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
562 av_freep(&udata);
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
563 return bits[opt_porder];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
564 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
565
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
566 static int get_max_p_order(int max_porder, int n, int order)
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
567 {
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
568 int porder = FFMIN(max_porder, av_log2(n^(n-1)));
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
569 if(order > 0)
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
570 porder = FFMIN(porder, av_log2(n/order));
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
571 return porder;
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
572 }
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
573
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
574 static uint32_t calc_rice_params_fixed(RiceContext *rc, int pmin, int pmax,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
575 int32_t *data, int n, int pred_order,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
576 int bps)
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
577 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
578 uint32_t bits;
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
579 pmin = get_max_p_order(pmin, n, pred_order);
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
580 pmax = get_max_p_order(pmax, n, pred_order);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
581 bits = pred_order*bps + 6;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
582 bits += calc_rice_params(rc, pmin, pmax, data, n, pred_order);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
583 return bits;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
584 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
585
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
586 static uint32_t calc_rice_params_lpc(RiceContext *rc, int pmin, int pmax,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
587 int32_t *data, int n, int pred_order,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
588 int bps, int precision)
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
589 {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
590 uint32_t bits;
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
591 pmin = get_max_p_order(pmin, n, pred_order);
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
592 pmax = get_max_p_order(pmax, n, pred_order);
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
593 bits = pred_order*bps + 4 + 5 + pred_order*precision + 6;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
594 bits += calc_rice_params(rc, pmin, pmax, data, n, pred_order);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
595 return bits;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
596 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
597
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
598 static void encode_residual_verbatim(int32_t *res, int32_t *smp, int n)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
599 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
600 assert(n > 0);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
601 memcpy(res, smp, n * sizeof(int32_t));
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
602 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
603
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
604 static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
605 int order)
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
606 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
607 int i;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
608
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
609 for(i=0; i<order; i++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
610 res[i] = smp[i];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
611 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
612
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
613 if(order==0){
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
614 for(i=order; i<n; i++)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
615 res[i]= smp[i];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
616 }else if(order==1){
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
617 for(i=order; i<n; i++)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
618 res[i]= smp[i] - smp[i-1];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
619 }else if(order==2){
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
620 int a = smp[order-1] - smp[order-2];
5739
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
621 for(i=order; i<n; i+=2) {
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
622 int b = smp[i] - smp[i-1];
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
623 res[i]= b - a;
5739
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
624 a = smp[i+1] - smp[i];
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
625 res[i+1]= a - b;
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
626 }
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
627 }else if(order==3){
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
628 int a = smp[order-1] - smp[order-2];
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
629 int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
5739
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
630 for(i=order; i<n; i+=2) {
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
631 int b = smp[i] - smp[i-1];
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
632 int d = b - a;
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
633 res[i]= d - c;
5739
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
634 a = smp[i+1] - smp[i];
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
635 c = a - b;
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
636 res[i+1]= c - d;
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
637 }
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
638 }else{
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
639 int a = smp[order-1] - smp[order-2];
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
640 int c = smp[order-1] - 2*smp[order-2] + smp[order-3];
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
641 int e = smp[order-1] - 3*smp[order-2] + 3*smp[order-3] - smp[order-4];
5739
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
642 for(i=order; i<n; i+=2) {
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
643 int b = smp[i] - smp[i-1];
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
644 int d = b - a;
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
645 int f = d - c;
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
646 res[i]= f - e;
5739
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
647 a = smp[i+1] - smp[i];
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
648 c = a - b;
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
649 e = c - d;
832a3152d38e unroll finite differences to avoid swapping registers.
lorenm
parents: 5738
diff changeset
650 res[i+1]= e - f;
5738
c1a4aae5adb4 encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents: 5737
diff changeset
651 }
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
652 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
653 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
654
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
655 #define LPC1(x) {\
5742
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
656 int c = coefs[(x)-1];\
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
657 p0 += c*s;\
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
658 s = smp[i-(x)+1];\
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
659 p1 += c*s;\
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
660 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
661
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
662 static av_always_inline void encode_residual_lpc_unrolled(
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
663 int32_t *res, const int32_t *smp, int n,
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
664 int order, const int32_t *coefs, int shift, int big)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
665 {
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
666 int i;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
667 for(i=order; i<n; i+=2) {
5742
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
668 int s = smp[i-order];
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
669 int p0 = 0, p1 = 0;
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
670 if(big) {
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
671 switch(order) {
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
672 case 32: LPC1(32)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
673 case 31: LPC1(31)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
674 case 30: LPC1(30)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
675 case 29: LPC1(29)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
676 case 28: LPC1(28)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
677 case 27: LPC1(27)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
678 case 26: LPC1(26)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
679 case 25: LPC1(25)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
680 case 24: LPC1(24)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
681 case 23: LPC1(23)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
682 case 22: LPC1(22)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
683 case 21: LPC1(21)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
684 case 20: LPC1(20)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
685 case 19: LPC1(19)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
686 case 18: LPC1(18)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
687 case 17: LPC1(17)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
688 case 16: LPC1(16)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
689 case 15: LPC1(15)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
690 case 14: LPC1(14)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
691 case 13: LPC1(13)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
692 case 12: LPC1(12)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
693 case 11: LPC1(11)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
694 case 10: LPC1(10)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
695 case 9: LPC1( 9)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
696 LPC1( 8)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
697 LPC1( 7)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
698 LPC1( 6)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
699 LPC1( 5)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
700 LPC1( 4)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
701 LPC1( 3)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
702 LPC1( 2)
5742
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
703 LPC1( 1)
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
704 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
705 } else {
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
706 switch(order) {
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
707 case 8: LPC1( 8)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
708 case 7: LPC1( 7)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
709 case 6: LPC1( 6)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
710 case 5: LPC1( 5)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
711 case 4: LPC1( 4)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
712 case 3: LPC1( 3)
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
713 case 2: LPC1( 2)
5742
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
714 case 1: LPC1( 1)
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
715 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
716 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
717 res[i ] = smp[i ] - (p0 >> shift);
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
718 res[i+1] = smp[i+1] - (p1 >> shift);
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
719 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
720 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
721
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
722 static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n,
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
723 int order, const int32_t *coefs, int shift)
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
724 {
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
725 int i;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
726 for(i=0; i<order; i++) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
727 res[i] = smp[i];
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
728 }
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 7864
diff changeset
729 #if CONFIG_SMALL
5720
b3695c272156 optimize encode_residual_lpc()
lorenm
parents: 4594
diff changeset
730 for(i=order; i<n; i+=2) {
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
731 int j;
5742
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
732 int s = smp[i];
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
733 int p0 = 0, p1 = 0;
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
734 for(j=0; j<order; j++) {
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
735 int c = coefs[j];
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
736 p1 += c*s;
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
737 s = smp[i-j-1];
5720
b3695c272156 optimize encode_residual_lpc()
lorenm
parents: 4594
diff changeset
738 p0 += c*s;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
739 }
5742
f8029206caa2 simplify lpc
lorenm
parents: 5739
diff changeset
740 res[i ] = smp[i ] - (p0 >> shift);
5720
b3695c272156 optimize encode_residual_lpc()
lorenm
parents: 4594
diff changeset
741 res[i+1] = smp[i+1] - (p1 >> shift);
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
742 }
5724
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
743 #else
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
744 switch(order) {
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
745 case 1: encode_residual_lpc_unrolled(res, smp, n, 1, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
746 case 2: encode_residual_lpc_unrolled(res, smp, n, 2, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
747 case 3: encode_residual_lpc_unrolled(res, smp, n, 3, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
748 case 4: encode_residual_lpc_unrolled(res, smp, n, 4, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
749 case 5: encode_residual_lpc_unrolled(res, smp, n, 5, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
750 case 6: encode_residual_lpc_unrolled(res, smp, n, 6, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
751 case 7: encode_residual_lpc_unrolled(res, smp, n, 7, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
752 case 8: encode_residual_lpc_unrolled(res, smp, n, 8, coefs, shift, 0); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
753 default: encode_residual_lpc_unrolled(res, smp, n, order, coefs, shift, 1); break;
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
754 }
96d1b6c30aad unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents: 5722
diff changeset
755 #endif
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
756 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
757
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
758 static int encode_residual(FlacEncodeContext *ctx, int ch)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
759 {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
760 int i, n;
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
761 int min_order, max_order, opt_order, precision, omethod;
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
762 int min_porder, max_porder;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
763 FlacFrame *frame;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
764 FlacSubframe *sub;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
765 int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
766 int shift[MAX_LPC_ORDER];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
767 int32_t *res, *smp;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
768
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
769 frame = &ctx->frame;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
770 sub = &frame->subframes[ch];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
771 res = sub->residual;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
772 smp = sub->samples;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
773 n = frame->blocksize;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
774
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
775 /* CONSTANT */
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
776 for(i=1; i<n; i++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
777 if(smp[i] != smp[0]) break;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
778 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
779 if(i == n) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
780 sub->type = sub->type_code = FLAC_SUBFRAME_CONSTANT;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
781 res[0] = smp[0];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
782 return sub->obits;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
783 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
784
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
785 /* VERBATIM */
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
786 if(n < 5) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
787 sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
788 encode_residual_verbatim(res, smp, n);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
789 return sub->obits * n;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
790 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
791
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
792 min_order = ctx->options.min_prediction_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
793 max_order = ctx->options.max_prediction_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
794 min_porder = ctx->options.min_partition_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
795 max_porder = ctx->options.max_partition_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
796 precision = ctx->options.lpc_coeff_precision;
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
797 omethod = ctx->options.prediction_order_method;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
798
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
799 /* FIXED */
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
800 if (ctx->options.lpc_type == AV_LPC_TYPE_NONE ||
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
801 ctx->options.lpc_type == AV_LPC_TYPE_FIXED || n <= max_order) {
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
802 uint32_t bits[MAX_FIXED_ORDER+1];
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
803 if(max_order > MAX_FIXED_ORDER) max_order = MAX_FIXED_ORDER;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
804 opt_order = 0;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
805 bits[0] = UINT32_MAX;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
806 for(i=min_order; i<=max_order; i++) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
807 encode_residual_fixed(res, smp, n, i);
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
808 bits[i] = calc_rice_params_fixed(&sub->rc, min_porder, max_porder, res,
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
809 n, i, sub->obits);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
810 if(bits[i] < bits[opt_order]) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
811 opt_order = i;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
812 }
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
813 }
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
814 sub->order = opt_order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
815 sub->type = FLAC_SUBFRAME_FIXED;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
816 sub->type_code = sub->type | sub->order;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
817 if(sub->order != max_order) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
818 encode_residual_fixed(res, smp, n, sub->order);
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
819 return calc_rice_params_fixed(&sub->rc, min_porder, max_porder, res, n,
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
820 sub->order, sub->obits);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
821 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
822 return bits[sub->order];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
823 }
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
824
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
825 /* LPC */
7592
377fddcc6288 cosmetics: adjust line breaks and vertical alignment
jbr
parents: 7591
diff changeset
826 opt_order = ff_lpc_calc_coefs(&ctx->dsp, smp, n, min_order, max_order,
12139
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
827 precision, coefs, shift, ctx->options.lpc_type,
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
828 ctx->options.lpc_passes, omethod,
e59926e2c50c Add AVCodecContext.lpc_type and Add AVCodecContext.lpc_passes fields.
jbr
parents: 12129
diff changeset
829 MAX_LPC_SHIFT, 0);
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
830
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
831 if(omethod == ORDER_METHOD_2LEVEL ||
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
832 omethod == ORDER_METHOD_4LEVEL ||
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
833 omethod == ORDER_METHOD_8LEVEL) {
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
834 int levels = 1 << omethod;
11936
0a36d4b2144b flacenc: convert VLA to fixed size
mru
parents: 11581
diff changeset
835 uint32_t bits[1 << ORDER_METHOD_8LEVEL];
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
836 int order;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
837 int opt_index = levels-1;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
838 opt_order = max_order-1;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
839 bits[opt_index] = UINT32_MAX;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
840 for(i=levels-1; i>=0; i--) {
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
841 order = min_order + (((max_order-min_order+1) * (i+1)) / levels)-1;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
842 if(order < 0) order = 0;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
843 encode_residual_lpc(res, smp, n, order+1, coefs[order], shift[order]);
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
844 bits[i] = calc_rice_params_lpc(&sub->rc, min_porder, max_porder,
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
845 res, n, order+1, sub->obits, precision);
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
846 if(bits[i] < bits[opt_index]) {
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
847 opt_index = i;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
848 opt_order = order;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
849 }
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
850 }
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
851 opt_order++;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
852 } else if(omethod == ORDER_METHOD_SEARCH) {
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
853 // brute-force optimal order search
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
854 uint32_t bits[MAX_LPC_ORDER];
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
855 opt_order = 0;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
856 bits[0] = UINT32_MAX;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
857 for(i=min_order-1; i<max_order; i++) {
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
858 encode_residual_lpc(res, smp, n, i+1, coefs[i], shift[i]);
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
859 bits[i] = calc_rice_params_lpc(&sub->rc, min_porder, max_porder,
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
860 res, n, i+1, sub->obits, precision);
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
861 if(bits[i] < bits[opt_order]) {
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
862 opt_order = i;
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
863 }
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
864 }
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
865 opt_order++;
3478
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
866 } else if(omethod == ORDER_METHOD_LOG) {
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
867 uint32_t bits[MAX_LPC_ORDER];
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
868 int step;
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
869
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
870 opt_order= min_order - 1 + (max_order-min_order)/3;
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
871 memset(bits, -1, sizeof(bits));
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
872
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
873 for(step=16 ;step; step>>=1){
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
874 int last= opt_order;
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
875 for(i=last-step; i<=last+step; i+= step){
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
876 if(i<min_order-1 || i>=max_order || bits[i] < UINT32_MAX)
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
877 continue;
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
878 encode_residual_lpc(res, smp, n, i+1, coefs[i], shift[i]);
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
879 bits[i] = calc_rice_params_lpc(&sub->rc, min_porder, max_porder,
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
880 res, n, i+1, sub->obits, precision);
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
881 if(bits[i] < bits[opt_order])
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
882 opt_order= i;
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
883 }
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
884 }
5a71102c2770 log prediction order search method
michael
parents: 3477
diff changeset
885 opt_order++;
3477
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
886 }
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
887
30ac8a424448 Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents: 3473
diff changeset
888 sub->order = opt_order;
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
889 sub->type = FLAC_SUBFRAME_LPC;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
890 sub->type_code = sub->type | (sub->order-1);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
891 sub->shift = shift[sub->order-1];
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
892 for(i=0; i<sub->order; i++) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
893 sub->coefs[i] = coefs[sub->order-1][i];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
894 }
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
895 encode_residual_lpc(res, smp, n, sub->order, sub->coefs, sub->shift);
3397
bdfc530c417c porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents: 3390
diff changeset
896 return calc_rice_params_lpc(&sub->rc, min_porder, max_porder, res, n, sub->order,
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
897 sub->obits, precision);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
898 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
899
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
900 static int encode_residual_v(FlacEncodeContext *ctx, int ch)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
901 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
902 int i, n;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
903 FlacFrame *frame;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
904 FlacSubframe *sub;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
905 int32_t *res, *smp;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
906
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
907 frame = &ctx->frame;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
908 sub = &frame->subframes[ch];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
909 res = sub->residual;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
910 smp = sub->samples;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
911 n = frame->blocksize;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
912
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
913 /* CONSTANT */
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
914 for(i=1; i<n; i++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
915 if(smp[i] != smp[0]) break;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
916 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
917 if(i == n) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
918 sub->type = sub->type_code = FLAC_SUBFRAME_CONSTANT;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
919 res[0] = smp[0];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
920 return sub->obits;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
921 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
922
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
923 /* VERBATIM */
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
924 sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
925 encode_residual_verbatim(res, smp, n);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
926 return sub->obits * n;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
927 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
928
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
929 static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n)
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
930 {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
931 int i, best;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
932 int32_t lt, rt;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
933 uint64_t sum[4];
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
934 uint64_t score[4];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
935 int k;
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
936
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
937 /* calculate sum of 2nd order residual for each channel */
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
938 sum[0] = sum[1] = sum[2] = sum[3] = 0;
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
939 for(i=2; i<n; i++) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
940 lt = left_ch[i] - 2*left_ch[i-1] + left_ch[i-2];
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
941 rt = right_ch[i] - 2*right_ch[i-1] + right_ch[i-2];
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
942 sum[2] += FFABS((lt + rt) >> 1);
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
943 sum[3] += FFABS(lt - rt);
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
944 sum[0] += FFABS(lt);
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
945 sum[1] += FFABS(rt);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
946 }
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
947 /* estimate bit counts */
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
948 for(i=0; i<4; i++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
949 k = find_optimal_param(2*sum[i], n);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
950 sum[i] = rice_encode_count(2*sum[i], n, k);
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
951 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
952
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
953 /* calculate score for each mode */
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
954 score[0] = sum[0] + sum[1];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
955 score[1] = sum[0] + sum[3];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
956 score[2] = sum[1] + sum[3];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
957 score[3] = sum[2] + sum[3];
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
958
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
959 /* return mode with lowest score */
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
960 best = 0;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
961 for(i=1; i<4; i++) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
962 if(score[i] < score[best]) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
963 best = i;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
964 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
965 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
966 if(best == 0) {
9208
443f056ba7e7 share channel mode constants between the FLAC decoder and FLAC encoder
jbr
parents: 9188
diff changeset
967 return FLAC_CHMODE_INDEPENDENT;
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
968 } else if(best == 1) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
969 return FLAC_CHMODE_LEFT_SIDE;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
970 } else if(best == 2) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
971 return FLAC_CHMODE_RIGHT_SIDE;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
972 } else {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
973 return FLAC_CHMODE_MID_SIDE;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
974 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
975 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
976
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
977 /**
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
978 * Perform stereo channel decorrelation
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
979 */
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
980 static void channel_decorrelation(FlacEncodeContext *ctx)
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
981 {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
982 FlacFrame *frame;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
983 int32_t *left, *right;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
984 int i, n;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
985
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
986 frame = &ctx->frame;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
987 n = frame->blocksize;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
988 left = frame->subframes[0].samples;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
989 right = frame->subframes[1].samples;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
990
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
991 if(ctx->channels != 2) {
9208
443f056ba7e7 share channel mode constants between the FLAC decoder and FLAC encoder
jbr
parents: 9188
diff changeset
992 frame->ch_mode = FLAC_CHMODE_INDEPENDENT;
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
993 return;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
994 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
995
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
996 frame->ch_mode = estimate_stereo_mode(left, right, n);
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
997
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
998 /* perform decorrelation and adjust bits-per-sample */
9208
443f056ba7e7 share channel mode constants between the FLAC decoder and FLAC encoder
jbr
parents: 9188
diff changeset
999 if(frame->ch_mode == FLAC_CHMODE_INDEPENDENT) {
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1000 return;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1001 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1002 if(frame->ch_mode == FLAC_CHMODE_MID_SIDE) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1003 int32_t tmp;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1004 for(i=0; i<n; i++) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1005 tmp = left[i];
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1006 left[i] = (tmp + right[i]) >> 1;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1007 right[i] = tmp - right[i];
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1008 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1009 frame->subframes[1].obits++;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1010 } else if(frame->ch_mode == FLAC_CHMODE_LEFT_SIDE) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1011 for(i=0; i<n; i++) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1012 right[i] = left[i] - right[i];
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1013 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1014 frame->subframes[1].obits++;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1015 } else {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1016 for(i=0; i<n; i++) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1017 left[i] -= right[i];
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1018 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1019 frame->subframes[0].obits++;
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1020 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1021 }
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1022
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1023 static void write_utf8(PutBitContext *pb, uint32_t val)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1024 {
4149
3118e8afb8a5 Fix ASF format parser's broken UTF-16 string handling
gpoirier
parents: 4001
diff changeset
1025 uint8_t tmp;
3118e8afb8a5 Fix ASF format parser's broken UTF-16 string handling
gpoirier
parents: 4001
diff changeset
1026 PUT_UTF8(val, tmp, put_bits(pb, 8, tmp);)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1027 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1028
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1029 static void output_frame_header(FlacEncodeContext *s)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1030 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1031 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1032 int crc;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1033
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1034 frame = &s->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1035
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1036 put_bits(&s->pb, 16, 0xFFF8);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1037 put_bits(&s->pb, 4, frame->bs_code[0]);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1038 put_bits(&s->pb, 4, s->sr_code[0]);
9208
443f056ba7e7 share channel mode constants between the FLAC decoder and FLAC encoder
jbr
parents: 9188
diff changeset
1039 if(frame->ch_mode == FLAC_CHMODE_INDEPENDENT) {
9209
514b73a654c9 flacenc: remove unneeded context variable, 'ch_code'
jbr
parents: 9208
diff changeset
1040 put_bits(&s->pb, 4, s->channels-1);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1041 } else {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1042 put_bits(&s->pb, 4, frame->ch_mode);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1043 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1044 put_bits(&s->pb, 3, 4); /* bits-per-sample code */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1045 put_bits(&s->pb, 1, 0);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1046 write_utf8(&s->pb, s->frame_count);
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1047 if(frame->bs_code[0] == 6) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1048 put_bits(&s->pb, 8, frame->bs_code[1]);
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1049 } else if(frame->bs_code[0] == 7) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1050 put_bits(&s->pb, 16, frame->bs_code[1]);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1051 }
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1052 if(s->sr_code[0] == 12) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1053 put_bits(&s->pb, 8, s->sr_code[1]);
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1054 } else if(s->sr_code[0] > 12) {
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1055 put_bits(&s->pb, 16, s->sr_code[1]);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1056 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1057 flush_put_bits(&s->pb);
6108
75804d49f33b improve CRC API
aurel
parents: 5852
diff changeset
1058 crc = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0,
75804d49f33b improve CRC API
aurel
parents: 5852
diff changeset
1059 s->pb.buf, put_bits_count(&s->pb)>>3);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1060 put_bits(&s->pb, 8, crc);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1061 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1062
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1063 static void output_subframe_constant(FlacEncodeContext *s, int ch)
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1064 {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1065 FlacSubframe *sub;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1066 int32_t res;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1067
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1068 sub = &s->frame.subframes[ch];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1069 res = sub->residual[0];
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1070 put_sbits(&s->pb, sub->obits, res);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1071 }
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1072
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1073 static void output_subframe_verbatim(FlacEncodeContext *s, int ch)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1074 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1075 int i;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1076 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1077 FlacSubframe *sub;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1078 int32_t res;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1079
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1080 frame = &s->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1081 sub = &frame->subframes[ch];
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1082
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1083 for(i=0; i<frame->blocksize; i++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1084 res = sub->residual[i];
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1085 put_sbits(&s->pb, sub->obits, res);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1086 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1087 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1088
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1089 static void output_residual(FlacEncodeContext *ctx, int ch)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1090 {
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1091 int i, j, p, n, parts;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1092 int k, porder, psize, res_cnt;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1093 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1094 FlacSubframe *sub;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1095 int32_t *res;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1096
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1097 frame = &ctx->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1098 sub = &frame->subframes[ch];
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1099 res = sub->residual;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1100 n = frame->blocksize;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1101
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1102 /* rice-encoded block */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1103 put_bits(&ctx->pb, 2, 0);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1104
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1105 /* partition order */
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1106 porder = sub->rc.porder;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1107 psize = n >> porder;
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1108 parts = (1 << porder);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1109 put_bits(&ctx->pb, 4, porder);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1110 res_cnt = psize - sub->order;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1111
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1112 /* residual */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1113 j = sub->order;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1114 for(p=0; p<parts; p++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1115 k = sub->rc.params[p];
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1116 put_bits(&ctx->pb, 4, k);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1117 if(p == 1) res_cnt = psize;
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1118 for(i=0; i<res_cnt && j<n; i++, j++) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1119 set_sr_golomb_flac(&ctx->pb, res[j], k, INT32_MAX, 0);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1120 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1121 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1122 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1123
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1124 static void output_subframe_fixed(FlacEncodeContext *ctx, int ch)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1125 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1126 int i;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1127 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1128 FlacSubframe *sub;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1129
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1130 frame = &ctx->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1131 sub = &frame->subframes[ch];
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1132
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1133 /* warm-up samples */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1134 for(i=0; i<sub->order; i++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1135 put_sbits(&ctx->pb, sub->obits, sub->residual[i]);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1136 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1137
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1138 /* residual */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1139 output_residual(ctx, ch);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1140 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1141
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1142 static void output_subframe_lpc(FlacEncodeContext *ctx, int ch)
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1143 {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1144 int i, cbits;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1145 FlacFrame *frame;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1146 FlacSubframe *sub;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1147
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1148 frame = &ctx->frame;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1149 sub = &frame->subframes[ch];
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1150
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1151 /* warm-up samples */
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1152 for(i=0; i<sub->order; i++) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1153 put_sbits(&ctx->pb, sub->obits, sub->residual[i]);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1154 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1155
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1156 /* LPC coefficients */
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1157 cbits = ctx->options.lpc_coeff_precision;
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1158 put_bits(&ctx->pb, 4, cbits-1);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1159 put_sbits(&ctx->pb, 5, sub->shift);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1160 for(i=0; i<sub->order; i++) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1161 put_sbits(&ctx->pb, cbits, sub->coefs[i]);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1162 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1163
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1164 /* residual */
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1165 output_residual(ctx, ch);
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1166 }
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1167
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1168 static void output_subframes(FlacEncodeContext *s)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1169 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1170 FlacFrame *frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1171 FlacSubframe *sub;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1172 int ch;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1173
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1174 frame = &s->frame;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1175
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1176 for(ch=0; ch<s->channels; ch++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1177 sub = &frame->subframes[ch];
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1178
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1179 /* subframe header */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1180 put_bits(&s->pb, 1, 0);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1181 put_bits(&s->pb, 6, sub->type_code);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1182 put_bits(&s->pb, 1, 0); /* no wasted bits */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1183
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1184 /* subframe */
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1185 if(sub->type == FLAC_SUBFRAME_CONSTANT) {
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1186 output_subframe_constant(s, ch);
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1187 } else if(sub->type == FLAC_SUBFRAME_VERBATIM) {
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1188 output_subframe_verbatim(s, ch);
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1189 } else if(sub->type == FLAC_SUBFRAME_FIXED) {
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1190 output_subframe_fixed(s, ch);
3385
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1191 } else if(sub->type == FLAC_SUBFRAME_LPC) {
340e5d35b326 flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents: 3384
diff changeset
1192 output_subframe_lpc(s, ch);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1193 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1194 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1195 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1196
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1197 static void output_frame_footer(FlacEncodeContext *s)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1198 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1199 int crc;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1200 flush_put_bits(&s->pb);
12129
8b28e74de2c0 Add av_ prefix to bswap macros
mru
parents: 12128
diff changeset
1201 crc = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0,
6108
75804d49f33b improve CRC API
aurel
parents: 5852
diff changeset
1202 s->pb.buf, put_bits_count(&s->pb)>>3));
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1203 put_bits(&s->pb, 16, crc);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1204 flush_put_bits(&s->pb);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1205 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1206
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1207 static void update_md5_sum(FlacEncodeContext *s, int16_t *samples)
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1208 {
9985
266bf83f634d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 9448
diff changeset
1209 #if HAVE_BIGENDIAN
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1210 int i;
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1211 for(i = 0; i < s->frame.blocksize*s->channels; i++) {
12129
8b28e74de2c0 Add av_ prefix to bswap macros
mru
parents: 12128
diff changeset
1212 int16_t smp = av_le2ne16(samples[i]);
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1213 av_md5_update(s->md5ctx, (uint8_t *)&smp, 2);
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1214 }
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1215 #else
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1216 av_md5_update(s->md5ctx, (uint8_t *)samples, s->frame.blocksize*s->channels*2);
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1217 #endif
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1218 }
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1219
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1220 static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame,
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1221 int buf_size, void *data)
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1222 {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1223 int ch;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1224 FlacEncodeContext *s;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1225 int16_t *samples = data;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1226 int out_bytes;
7599
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1227 int reencoded=0;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1228
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1229 s = avctx->priv_data;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1230
7599
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1231 if(buf_size < s->max_framesize*2) {
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1232 av_log(avctx, AV_LOG_ERROR, "output buffer too small\n");
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1233 return 0;
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1234 }
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1235
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1236 /* when the last block is reached, update the header in extradata */
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1237 if (!data) {
7864
4820bd751284 write actual min and max frame size to FLAC header. update regression test checksum.
jbr
parents: 7861
diff changeset
1238 s->max_framesize = s->max_encoded_framesize;
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1239 av_md5_final(s->md5ctx, s->md5sum);
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1240 write_streaminfo(s, avctx->extradata);
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1241 return 0;
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1242 }
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1243
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1244 init_frame(s);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1245
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1246 copy_samples(s, samples);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1247
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1248 channel_decorrelation(s);
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1249
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1250 for(ch=0; ch<s->channels; ch++) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1251 encode_residual(s, ch);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1252 }
7599
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1253
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1254 write_frame:
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1255 init_put_bits(&s->pb, frame, buf_size);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1256 output_frame_header(s);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1257 output_subframes(s);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1258 output_frame_footer(s);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1259 out_bytes = put_bits_count(&s->pb) >> 3;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1260
7599
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1261 if(out_bytes > s->max_framesize) {
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1262 if(reencoded) {
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1263 /* still too large. must be an error. */
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1264 av_log(avctx, AV_LOG_ERROR, "error encoding frame\n");
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1265 return -1;
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1266 }
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1267
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1268 /* frame too large. use verbatim mode */
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1269 for(ch=0; ch<s->channels; ch++) {
3365
84f29207af3a flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents: 3358
diff changeset
1270 encode_residual_v(s, ch);
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1271 }
7599
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1272 reencoded = 1;
3c07ce8ac9f7 fix and simplify frame size check and reencoding in verbatim mode
jbr
parents: 7594
diff changeset
1273 goto write_frame;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1274 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1275
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1276 s->frame_count++;
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1277 s->sample_count += avctx->frame_size;
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1278 update_md5_sum(s, samples);
7864
4820bd751284 write actual min and max frame size to FLAC header. update regression test checksum.
jbr
parents: 7861
diff changeset
1279 if (out_bytes > s->max_encoded_framesize)
4820bd751284 write actual min and max frame size to FLAC header. update regression test checksum.
jbr
parents: 7861
diff changeset
1280 s->max_encoded_framesize = out_bytes;
9212
c7a8e302b98a flacenc: remove unneeded variable, 'min_encoded_framesize' and use
jbr
parents: 9209
diff changeset
1281 if (out_bytes < s->min_framesize)
c7a8e302b98a flacenc: remove unneeded variable, 'min_encoded_framesize' and use
jbr
parents: 9209
diff changeset
1282 s->min_framesize = out_bytes;
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1283
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1284 return out_bytes;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1285 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1286
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6341
diff changeset
1287 static av_cold int flac_encode_close(AVCodecContext *avctx)
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1288 {
7861
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1289 if (avctx->priv_data) {
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1290 FlacEncodeContext *s = avctx->priv_data;
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1291 av_freep(&s->md5ctx);
f092dd630095 write MD5 checksum to FLAC header. update regression tests.
jbr
parents: 7860
diff changeset
1292 }
3358
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1293 av_freep(&avctx->extradata);
4ae69b5b596b stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents: 3357
diff changeset
1294 avctx->extradata_size = 0;
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1295 av_freep(&avctx->coded_frame);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1296 return 0;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1297 }
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1298
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1299 AVCodec flac_encoder = {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1300 "flac",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10424
diff changeset
1301 AVMEDIA_TYPE_AUDIO,
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1302 CODEC_ID_FLAC,
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1303 sizeof(FlacEncodeContext),
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1304 flac_encode_init,
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1305 flac_encode_frame,
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1306 flac_encode_close,
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1307 NULL,
7860
c11e175fc544 write number of samples in FLAC extradata.
jbr
parents: 7599
diff changeset
1308 .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY,
10145
7955db355703 Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents: 9985
diff changeset
1309 .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6763
diff changeset
1310 .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff changeset
1311 };