Mercurial > libavcodec.hg
annotate flacenc.c @ 7352:c2318e551ff5 libavcodec
When picking a "high utility centroid" do not pick one
that has no corresponding points. Not only it is the
worst possible pick, but also the code was written
without this case in mind.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 03:55:37 +0000 |
parents | 3ec34b551aae |
children | 85ab7655ad4d |
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 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
3 * Copyright (c) 2006 Justin Ruggles <jruggle@earthlink.net> |
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 | 22 #include "libavutil/crc.h" |
23 #include "libavutil/lls.h" | |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
24 #include "avcodec.h" |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
25 #include "bitstream.h" |
5737 | 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" |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
28 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
29 #define FLAC_MAX_CH 8 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
30 #define FLAC_MIN_BLOCKSIZE 16 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
31 #define FLAC_MAX_BLOCKSIZE 65535 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
32 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
33 #define FLAC_SUBFRAME_CONSTANT 0 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
34 #define FLAC_SUBFRAME_VERBATIM 1 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
35 #define FLAC_SUBFRAME_FIXED 8 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
36 #define FLAC_SUBFRAME_LPC 32 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
37 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
38 #define FLAC_CHMODE_NOT_STEREO 0 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
39 #define FLAC_CHMODE_LEFT_RIGHT 1 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
40 #define FLAC_CHMODE_LEFT_SIDE 8 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
41 #define FLAC_CHMODE_RIGHT_SIDE 9 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
42 #define FLAC_CHMODE_MID_SIDE 10 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
43 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
44 #define ORDER_METHOD_EST 0 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
45 #define ORDER_METHOD_2LEVEL 1 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
46 #define ORDER_METHOD_4LEVEL 2 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
47 #define ORDER_METHOD_8LEVEL 3 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
48 #define ORDER_METHOD_SEARCH 4 |
3478 | 49 #define ORDER_METHOD_LOG 5 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
50 |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
51 #define FLAC_STREAMINFO_SIZE 34 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
52 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
53 #define MIN_LPC_ORDER 1 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
54 #define MAX_LPC_ORDER 32 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
55 #define MAX_FIXED_ORDER 4 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
56 #define MAX_PARTITION_ORDER 8 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
57 #define MAX_PARTITIONS (1 << MAX_PARTITION_ORDER) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
58 #define MAX_LPC_PRECISION 15 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
59 #define MAX_LPC_SHIFT 15 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
60 #define MAX_RICE_PARAM 14 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
61 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
62 typedef struct CompressionOptions { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
63 int compression_level; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
64 int block_time_ms; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
65 int use_lpc; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
66 int lpc_coeff_precision; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
67 int min_prediction_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
68 int max_prediction_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
69 int prediction_order_method; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
70 int min_partition_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
71 int max_partition_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
72 } CompressionOptions; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
73 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
74 typedef struct RiceContext { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
75 int porder; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
76 int params[MAX_PARTITIONS]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
77 } RiceContext; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
78 |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
79 typedef struct FlacSubframe { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
80 int type; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
81 int type_code; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
82 int obits; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
83 int order; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
84 int32_t coefs[MAX_LPC_ORDER]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
85 int shift; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
86 RiceContext rc; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
87 int32_t samples[FLAC_MAX_BLOCKSIZE]; |
5722 | 88 int32_t residual[FLAC_MAX_BLOCKSIZE+1]; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
89 } FlacSubframe; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
90 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
91 typedef struct FlacFrame { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
92 FlacSubframe subframes[FLAC_MAX_CH]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
93 int blocksize; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
94 int bs_code[2]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
95 uint8_t crc8; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
96 int ch_mode; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
97 } FlacFrame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
98 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
99 typedef struct FlacEncodeContext { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
100 PutBitContext pb; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
101 int channels; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
102 int ch_code; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
103 int samplerate; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
104 int sr_code[2]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
105 int max_framesize; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
106 uint32_t frame_count; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
107 FlacFrame frame; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
108 CompressionOptions options; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
109 AVCodecContext *avctx; |
5737 | 110 DSPContext dsp; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
111 } FlacEncodeContext; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
112 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
113 static const int flac_samplerates[16] = { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
114 0, 0, 0, 0, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
115 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
116 0, 0, 0, 0 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
117 }; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
118 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
119 static const int flac_blocksizes[16] = { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
120 0, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
121 192, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
122 576, 1152, 2304, 4608, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
123 0, 0, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
124 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 |
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 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
127 /** |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
128 * Writes streaminfo metadata block to byte array |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
129 */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
130 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
|
131 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
132 PutBitContext pb; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
133 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
134 memset(header, 0, FLAC_STREAMINFO_SIZE); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
135 init_put_bits(&pb, header, FLAC_STREAMINFO_SIZE); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
136 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
137 /* streaminfo metadata block */ |
6548 | 138 put_bits(&pb, 16, s->avctx->frame_size); |
139 put_bits(&pb, 16, s->avctx->frame_size); | |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
140 put_bits(&pb, 24, 0); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
141 put_bits(&pb, 24, s->max_framesize); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
142 put_bits(&pb, 20, s->samplerate); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
143 put_bits(&pb, 3, s->channels-1); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
144 put_bits(&pb, 5, 15); /* bits per sample - 1 */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
145 flush_put_bits(&pb); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
146 /* total samples = 0 */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
147 /* MD5 signature = 0 */ |
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 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
150 /** |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
151 * Sets blocksize based on samplerate |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
152 * Chooses the closest predefined blocksize >= BLOCK_TIME_MS milliseconds |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
153 */ |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
154 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
|
155 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
156 int i; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
157 int target; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
158 int blocksize; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
159 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
160 assert(samplerate > 0); |
3354 | 161 blocksize = flac_blocksizes[1]; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
162 target = (samplerate * block_time_ms) / 1000; |
3354 | 163 for(i=0; i<16; i++) { |
164 if(target >= flac_blocksizes[i] && flac_blocksizes[i] > blocksize) { | |
165 blocksize = flac_blocksizes[i]; | |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
166 } |
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 return blocksize; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
169 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
170 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6341
diff
changeset
|
171 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
|
172 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
173 int freq = avctx->sample_rate; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
174 int channels = avctx->channels; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
175 FlacEncodeContext *s = avctx->priv_data; |
3386 | 176 int i, level; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
177 uint8_t *streaminfo; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
178 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
179 s->avctx = avctx; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
180 |
5737 | 181 dsputil_init(&s->dsp, avctx); |
182 | |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
183 if(avctx->sample_fmt != SAMPLE_FMT_S16) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
184 return -1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
185 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
186 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
187 if(channels < 1 || channels > FLAC_MAX_CH) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
188 return -1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
189 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
190 s->channels = channels; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
191 s->ch_code = s->channels-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 /* find samplerate in table */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
194 if(freq < 1) |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
195 return -1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
196 for(i=4; i<12; i++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
197 if(freq == flac_samplerates[i]) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
198 s->samplerate = flac_samplerates[i]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
199 s->sr_code[0] = i; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
200 s->sr_code[1] = 0; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
201 break; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
202 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
203 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
204 /* if not in table, samplerate is non-standard */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
205 if(i == 12) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
206 if(freq % 1000 == 0 && freq < 255000) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
207 s->sr_code[0] = 12; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
208 s->sr_code[1] = freq / 1000; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
209 } else if(freq % 10 == 0 && freq < 655350) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
210 s->sr_code[0] = 14; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
211 s->sr_code[1] = freq / 10; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
212 } else if(freq < 65535) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
213 s->sr_code[0] = 13; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
214 s->sr_code[1] = freq; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
215 } else { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
216 return -1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
217 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
218 s->samplerate = freq; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
219 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
220 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
221 /* set compression option defaults based on avctx->compression_level */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
222 if(avctx->compression_level < 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
223 s->options.compression_level = 5; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
224 } else { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
225 s->options.compression_level = avctx->compression_level; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
226 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
227 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
|
228 |
3386 | 229 level= s->options.compression_level; |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
230 if(level > 12) { |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
231 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
|
232 s->options.compression_level); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
233 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
234 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
235 |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
236 s->options.block_time_ms = ((int[]){ 27, 27, 27,105,105,105,105,105,105,105,105,105,105})[level]; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
237 s->options.use_lpc = ((int[]){ 0, 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
|
238 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
|
239 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
|
240 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
|
241 ORDER_METHOD_EST, ORDER_METHOD_EST, ORDER_METHOD_EST, |
3480
9eb59c4a22d2
Modify preset compression levels to utilize log search.
jbr
parents:
3478
diff
changeset
|
242 ORDER_METHOD_4LEVEL, ORDER_METHOD_LOG, ORDER_METHOD_4LEVEL, |
9eb59c4a22d2
Modify preset compression levels to utilize log search.
jbr
parents:
3478
diff
changeset
|
243 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
|
244 ORDER_METHOD_SEARCH})[level]; |
3481 | 245 s->options.min_partition_order = ((int[]){ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})[level]; |
246 s->options.max_partition_order = ((int[]){ 2, 2, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8})[level]; | |
3386 | 247 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
248 /* set compression option overrides from AVCodecContext */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
249 if(avctx->use_lpc >= 0) { |
4594 | 250 s->options.use_lpc = av_clip(avctx->use_lpc, 0, 11); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
251 } |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
252 if(s->options.use_lpc == 1) |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
253 av_log(avctx, AV_LOG_DEBUG, " use lpc: Levinson-Durbin recursion with Welch window\n"); |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
254 else if(s->options.use_lpc > 1) |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
255 av_log(avctx, AV_LOG_DEBUG, " use lpc: Cholesky factorization\n"); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
256 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
257 if(avctx->min_prediction_order >= 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
258 if(s->options.use_lpc) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
259 if(avctx->min_prediction_order < MIN_LPC_ORDER || |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
260 avctx->min_prediction_order > MAX_LPC_ORDER) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
261 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
|
262 avctx->min_prediction_order); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
263 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
264 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
265 } else { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
266 if(avctx->min_prediction_order > MAX_FIXED_ORDER) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
267 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
|
268 avctx->min_prediction_order); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
269 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
270 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
271 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
272 s->options.min_prediction_order = avctx->min_prediction_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
273 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
274 if(avctx->max_prediction_order >= 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
275 if(s->options.use_lpc) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
276 if(avctx->max_prediction_order < MIN_LPC_ORDER || |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
277 avctx->max_prediction_order > MAX_LPC_ORDER) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
278 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
|
279 avctx->max_prediction_order); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
280 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
281 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
282 } else { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
283 if(avctx->max_prediction_order > MAX_FIXED_ORDER) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
284 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
|
285 avctx->max_prediction_order); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
286 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
287 } |
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.max_prediction_order = avctx->max_prediction_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
290 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
291 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
|
292 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
|
293 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
|
294 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
295 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
296 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
|
297 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
|
298 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
299 if(avctx->prediction_order_method >= 0) { |
3478 | 300 if(avctx->prediction_order_method > ORDER_METHOD_LOG) { |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
301 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
|
302 avctx->prediction_order_method); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
303 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
304 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
305 s->options.prediction_order_method = avctx->prediction_order_method; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
306 } |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
307 switch(s->options.prediction_order_method) { |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
308 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
|
309 "estimate"); break; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
310 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
|
311 "2-level"); break; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
312 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
|
313 "4-level"); break; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
314 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
|
315 "8-level"); break; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
316 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
|
317 "full search"); break; |
3478 | 318 case ORDER_METHOD_LOG: av_log(avctx, AV_LOG_DEBUG, " order method: %s\n", |
319 "log search"); break; | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
320 } |
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 if(avctx->min_partition_order >= 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
323 if(avctx->min_partition_order > MAX_PARTITION_ORDER) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
324 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
|
325 avctx->min_partition_order); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
326 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
327 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
328 s->options.min_partition_order = avctx->min_partition_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
329 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
330 if(avctx->max_partition_order >= 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
331 if(avctx->max_partition_order > MAX_PARTITION_ORDER) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
332 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
|
333 avctx->max_partition_order); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
334 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
335 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
336 s->options.max_partition_order = avctx->max_partition_order; |
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 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
|
339 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
|
340 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
|
341 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
342 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
343 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
|
344 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
|
345 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
346 if(avctx->frame_size > 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
347 if(avctx->frame_size < FLAC_MIN_BLOCKSIZE || |
3442
5d133e59ecf2
allows user-settable block size and fixes related typo
jbr
parents:
3397
diff
changeset
|
348 avctx->frame_size > FLAC_MAX_BLOCKSIZE) { |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
349 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
|
350 avctx->frame_size); |
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 } else { |
6548 | 354 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
|
355 } |
6548 | 356 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
|
357 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
358 /* set LPC precision */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
359 if(avctx->lpc_coeff_precision > 0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
360 if(avctx->lpc_coeff_precision > MAX_LPC_PRECISION) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
361 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
|
362 avctx->lpc_coeff_precision); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
363 return -1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
364 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
365 s->options.lpc_coeff_precision = avctx->lpc_coeff_precision; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
366 } else { |
6545
85acd5166cf8
Use 15-bit LPC precision by default. This generally gives better compression
jbr
parents:
6517
diff
changeset
|
367 /* default LPC precision */ |
85acd5166cf8
Use 15-bit LPC precision by default. This generally gives better compression
jbr
parents:
6517
diff
changeset
|
368 s->options.lpc_coeff_precision = 15; |
3385
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 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
|
371 s->options.lpc_coeff_precision); |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
372 |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
373 /* set maximum encoded frame size in verbatim mode */ |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
374 if(s->channels == 2) { |
6548 | 375 s->max_framesize = 14 + ((s->avctx->frame_size * 33 + 7) >> 3); |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
376 } else { |
6548 | 377 s->max_framesize = 14 + (s->avctx->frame_size * s->channels * 2); |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
378 } |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
379 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
380 streaminfo = av_malloc(FLAC_STREAMINFO_SIZE); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
381 write_streaminfo(s, streaminfo); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
382 avctx->extradata = streaminfo; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
383 avctx->extradata_size = FLAC_STREAMINFO_SIZE; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
384 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
385 s->frame_count = 0; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
386 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
387 avctx->coded_frame = avcodec_alloc_frame(); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
388 avctx->coded_frame->key_frame = 1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
389 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
390 return 0; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
391 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
392 |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
393 static void init_frame(FlacEncodeContext *s) |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
394 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
395 int i, ch; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
396 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
397 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
398 frame = &s->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
399 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
400 for(i=0; i<16; i++) { |
6548 | 401 if(s->avctx->frame_size == flac_blocksizes[i]) { |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
402 frame->blocksize = flac_blocksizes[i]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
403 frame->bs_code[0] = i; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
404 frame->bs_code[1] = 0; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
405 break; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
406 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
407 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
408 if(i == 16) { |
6548 | 409 frame->blocksize = s->avctx->frame_size; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
410 if(frame->blocksize <= 256) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
411 frame->bs_code[0] = 6; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
412 frame->bs_code[1] = frame->blocksize-1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
413 } else { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
414 frame->bs_code[0] = 7; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
415 frame->bs_code[1] = frame->blocksize-1; |
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 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
418 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
419 for(ch=0; ch<s->channels; ch++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
420 frame->subframes[ch].obits = 16; |
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 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
423 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
424 /** |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
425 * Copy channel-interleaved input samples into separate subframes |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
426 */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
427 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
|
428 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
429 int i, j, ch; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
430 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
431 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
432 frame = &s->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
433 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
|
434 for(ch=0; ch<s->channels; ch++,j++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
435 frame->subframes[ch].samples[i] = samples[j]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
436 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
437 } |
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 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
440 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
441 #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
|
442 |
5732
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
443 /** |
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
444 * 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
|
445 */ |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
446 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
|
447 { |
5732
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
448 int k; |
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
449 uint32_t sum2; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
450 |
5732
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
451 if(sum <= n>>1) |
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
452 return 0; |
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
453 sum2 = sum-(n>>1); |
d6fc148d1a48
replace brute force find_optimal_param() with a closed-form solution.
lorenm
parents:
5731
diff
changeset
|
454 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
|
455 return FFMIN(k, MAX_RICE_PARAM); |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
456 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
457 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
458 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
|
459 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
|
460 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
461 int i; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
462 int k, cnt, part; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
463 uint32_t all_bits; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
464 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
465 part = (1 << porder); |
5852 | 466 all_bits = 4 * part; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
467 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
468 cnt = (n >> porder) - pred_order; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
469 for(i=0; i<part; i++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
470 k = find_optimal_param(sums[i], cnt); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
471 rc->params[i] = k; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
472 all_bits += rice_encode_count(sums[i], cnt, k); |
5852 | 473 cnt = n >> porder; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
474 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
475 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
476 rc->porder = porder; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
477 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
478 return all_bits; |
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 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
481 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
|
482 uint32_t sums[][MAX_PARTITIONS]) |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
483 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
484 int i, j; |
3384 | 485 int parts; |
486 uint32_t *res, *res_end; | |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
487 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
488 /* sums for highest level */ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
489 parts = (1 << pmax); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
490 res = &data[pred_order]; |
3384 | 491 res_end = &data[n >> pmax]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
492 for(i=0; i<parts; i++) { |
5731
976b4c5e68bb
gcc isn't smart enough to factor out duplicate stores
lorenm
parents:
5729
diff
changeset
|
493 uint32_t sum = 0; |
3384 | 494 while(res < res_end){ |
5731
976b4c5e68bb
gcc isn't smart enough to factor out duplicate stores
lorenm
parents:
5729
diff
changeset
|
495 sum += *(res++); |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
496 } |
5731
976b4c5e68bb
gcc isn't smart enough to factor out duplicate stores
lorenm
parents:
5729
diff
changeset
|
497 sums[pmax][i] = sum; |
3384 | 498 res_end+= n >> pmax; |
3365
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 /* sums for lower levels */ |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
501 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
|
502 parts = (1 << i); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
503 for(j=0; j<parts; j++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
504 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
|
505 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
506 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
507 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
508 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
509 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
|
510 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
|
511 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
512 int i; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
513 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
|
514 int opt_porder; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
515 RiceContext tmp_rc; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
516 uint32_t *udata; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
517 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
|
518 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
519 assert(pmin >= 0 && pmin <= MAX_PARTITION_ORDER); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
520 assert(pmax >= 0 && pmax <= MAX_PARTITION_ORDER); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
521 assert(pmin <= pmax); |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
522 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
523 udata = av_malloc(n * sizeof(uint32_t)); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
524 for(i=0; i<n; i++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
525 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
|
526 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
527 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
528 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
|
529 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
530 opt_porder = pmin; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
531 bits[pmin] = UINT32_MAX; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
532 for(i=pmin; i<=pmax; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
533 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
|
534 if(bits[i] <= bits[opt_porder]) { |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
535 opt_porder = i; |
3387 | 536 *rc= tmp_rc; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
537 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
538 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
539 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
540 av_freep(&udata); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
541 return bits[opt_porder]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
542 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
543 |
3397
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
544 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
|
545 { |
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
546 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
|
547 if(order > 0) |
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
548 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
|
549 return porder; |
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
550 } |
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
551 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
552 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
|
553 int32_t *data, int n, int pred_order, |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
554 int bps) |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
555 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
556 uint32_t bits; |
3397
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
557 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
|
558 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
|
559 bits = pred_order*bps + 6; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
560 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
|
561 return bits; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
562 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
563 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
564 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
|
565 int32_t *data, int n, int pred_order, |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
566 int bps, int precision) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
567 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
568 uint32_t bits; |
3397
bdfc530c417c
porder patch by (Justin Ruggles jruggle a t earthlink d ot net)
michael
parents:
3390
diff
changeset
|
569 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
|
570 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
|
571 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
|
572 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
|
573 return bits; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
574 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
575 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
576 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
577 * Apply Welch window function to audio block |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
578 */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
579 static void apply_welch_window(const int32_t *data, int len, double *w_data) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
580 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
581 int i, n2; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
582 double w; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
583 double c; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
584 |
6341 | 585 assert(!(len&1)); //the optimization in r11881 does not support odd len |
586 //if someone wants odd len extend the change in r11881 | |
587 | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
588 n2 = (len >> 1); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
589 c = 2.0 / (len - 1.0); |
6338 | 590 |
591 w_data+=n2; | |
592 data+=n2; | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
593 for(i=0; i<n2; i++) { |
6338 | 594 w = c - n2 + i; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
595 w = 1.0 - (w * w); |
6338 | 596 w_data[-i-1] = data[-i-1] * w; |
597 w_data[+i ] = data[+i ] * w; | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
598 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
599 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
600 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
601 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
602 * Calculates autocorrelation data from audio samples |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
603 * A Welch window function is applied before calculation. |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
604 */ |
5737 | 605 void ff_flac_compute_autocorr(const int32_t *data, int len, int lag, |
606 double *autoc) | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
607 { |
5729 | 608 int i, j; |
5733
c2f88af57c16
was computing one more autocorrelation coefficient that was actually used
lorenm
parents:
5732
diff
changeset
|
609 double tmp[len + lag + 1]; |
3388 | 610 double *data1= tmp + lag; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
611 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
612 apply_welch_window(data, len, data1); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
613 |
5729 | 614 for(j=0; j<lag; j++) |
615 data1[j-lag]= 0.0; | |
5733
c2f88af57c16
was computing one more autocorrelation coefficient that was actually used
lorenm
parents:
5732
diff
changeset
|
616 data1[len] = 0.0; |
5729 | 617 |
618 for(j=0; j<lag; j+=2){ | |
619 double sum0 = 1.0, sum1 = 1.0; | |
620 for(i=0; i<len; i++){ | |
621 sum0 += data1[i] * data1[i-j]; | |
622 sum1 += data1[i] * data1[i-j-1]; | |
623 } | |
624 autoc[j ] = sum0; | |
625 autoc[j+1] = sum1; | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
626 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
627 |
5729 | 628 if(j==lag){ |
629 double sum = 1.0; | |
5733
c2f88af57c16
was computing one more autocorrelation coefficient that was actually used
lorenm
parents:
5732
diff
changeset
|
630 for(i=0; i<len; i+=2){ |
c2f88af57c16
was computing one more autocorrelation coefficient that was actually used
lorenm
parents:
5732
diff
changeset
|
631 sum += data1[i ] * data1[i-j ] |
c2f88af57c16
was computing one more autocorrelation coefficient that was actually used
lorenm
parents:
5732
diff
changeset
|
632 + data1[i+1] * data1[i-j+1]; |
c2f88af57c16
was computing one more autocorrelation coefficient that was actually used
lorenm
parents:
5732
diff
changeset
|
633 } |
5729 | 634 autoc[j] = sum; |
3388 | 635 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
636 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
637 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
638 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
639 * Levinson-Durbin recursion. |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
640 * Produces LPC coefficients from autocorrelation data. |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
641 */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
642 static void compute_lpc_coefs(const double *autoc, int max_order, |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
643 double lpc[][MAX_LPC_ORDER], double *ref) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
644 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
645 int i, j, i2; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
646 double r, err, tmp; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
647 double lpc_tmp[MAX_LPC_ORDER]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
648 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
649 for(i=0; i<max_order; i++) lpc_tmp[i] = 0; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
650 err = autoc[0]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
651 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
652 for(i=0; i<max_order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
653 r = -autoc[i+1]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
654 for(j=0; j<i; j++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
655 r -= lpc_tmp[j] * autoc[i-j]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
656 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
657 r /= err; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
658 ref[i] = fabs(r); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
659 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
660 err *= 1.0 - (r * r); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
661 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
662 i2 = (i >> 1); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
663 lpc_tmp[i] = r; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
664 for(j=0; j<i2; j++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
665 tmp = lpc_tmp[j]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
666 lpc_tmp[j] += r * lpc_tmp[i-1-j]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
667 lpc_tmp[i-1-j] += r * tmp; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
668 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
669 if(i & 1) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
670 lpc_tmp[j] += lpc_tmp[j] * r; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
671 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
672 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
673 for(j=0; j<=i; j++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
674 lpc[i][j] = -lpc_tmp[j]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
675 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
676 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
677 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
678 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
679 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
680 * Quantize LPC coefficients |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
681 */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
682 static void quantize_lpc_coefs(double *lpc_in, int order, int precision, |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
683 int32_t *lpc_out, int *shift) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
684 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
685 int i; |
3464 | 686 double cmax, error; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
687 int32_t qmax; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
688 int sh; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
689 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
690 /* define maximum levels */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
691 qmax = (1 << (precision - 1)) - 1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
692 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
693 /* find maximum coefficient value */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
694 cmax = 0.0; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
695 for(i=0; i<order; i++) { |
3389 | 696 cmax= FFMAX(cmax, fabs(lpc_in[i])); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
697 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
698 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
699 /* if maximum value quantizes to zero, return all zeros */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
700 if(cmax * (1 << MAX_LPC_SHIFT) < 1.0) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
701 *shift = 0; |
3389 | 702 memset(lpc_out, 0, sizeof(int32_t) * order); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
703 return; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
704 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
705 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
706 /* calculate level shift which scales max coeff to available bits */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
707 sh = MAX_LPC_SHIFT; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
708 while((cmax * (1 << sh) > qmax) && (sh > 0)) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
709 sh--; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
710 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
711 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
712 /* since negative shift values are unsupported in decoder, scale down |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
713 coefficients instead */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
714 if(sh == 0 && cmax > qmax) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
715 double scale = ((double)qmax) / cmax; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
716 for(i=0; i<order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
717 lpc_in[i] *= scale; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
718 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
719 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
720 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
721 /* output quantized coefficients and level shift */ |
3464 | 722 error=0; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
723 for(i=0; i<order; i++) { |
3464 | 724 error += lpc_in[i] * (1 << sh); |
4594 | 725 lpc_out[i] = av_clip(lrintf(error), -qmax, qmax); |
3464 | 726 error -= lpc_out[i]; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
727 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
728 *shift = sh; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
729 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
730 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
731 static int estimate_best_order(double *ref, int max_order) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
732 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
733 int i, est; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
734 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
735 est = 1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
736 for(i=max_order-1; i>=0; i--) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
737 if(ref[i] > 0.10) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
738 est = i+1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
739 break; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
740 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
741 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
742 return est; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
743 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
744 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
745 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
746 * Calculate LPC coefficients for multiple orders |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
747 */ |
5737 | 748 static int lpc_calc_coefs(FlacEncodeContext *s, |
749 const int32_t *samples, int blocksize, int max_order, | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
750 int precision, int32_t coefs[][MAX_LPC_ORDER], |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
751 int *shift, int use_lpc, int omethod) |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
752 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
753 double autoc[MAX_LPC_ORDER+1]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
754 double ref[MAX_LPC_ORDER]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
755 double lpc[MAX_LPC_ORDER][MAX_LPC_ORDER]; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
756 int i, j, pass; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
757 int opt_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
758 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
759 assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
760 |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
761 if(use_lpc == 1){ |
5737 | 762 s->dsp.flac_compute_autocorr(samples, blocksize, max_order, autoc); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
763 |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
764 compute_lpc_coefs(autoc, max_order, lpc, ref); |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
765 }else{ |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
766 LLSModel m[2]; |
5743 | 767 double var[MAX_LPC_ORDER+1], weight; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
768 |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
769 for(pass=0; pass<use_lpc-1; pass++){ |
3470 | 770 av_init_lls(&m[pass&1], max_order); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
771 |
3473
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
772 weight=0; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
773 for(i=max_order; i<blocksize; i++){ |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
774 for(j=0; j<=max_order; j++) |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
775 var[j]= samples[i-j]; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
776 |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
777 if(pass){ |
5743 | 778 double eval, inv, rinv; |
3473
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
779 eval= av_evaluate_lls(&m[(pass-1)&1], var+1, max_order-1); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
780 eval= (512>>pass) + fabs(eval - var[0]); |
5743 | 781 inv = 1/eval; |
782 rinv = sqrt(inv); | |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
783 for(j=0; j<=max_order; j++) |
5743 | 784 var[j] *= rinv; |
785 weight += inv; | |
3473
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
786 }else |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
787 weight++; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
788 |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
789 av_update_lls(&m[pass&1], var, 1.0); |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
790 } |
3473
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
791 av_solve_lls(&m[pass&1], 0.001, 0); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
792 } |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
793 |
3473
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
794 for(i=0; i<max_order; i++){ |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
795 for(j=0; j<max_order; j++) |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
796 lpc[i][j]= m[(pass-1)&1].coeff[i][j]; |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
797 ref[i]= sqrt(m[(pass-1)&1].variance[i] / weight) * (blocksize - max_order) / 4000; |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
798 } |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
799 for(i=max_order-1; i>0; i--) |
fa545ed305c9
calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
michael
parents:
3470
diff
changeset
|
800 ref[i] = ref[i-1] - ref[i]; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
801 } |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
802 opt_order = max_order; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
803 |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
804 if(omethod == ORDER_METHOD_EST) { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
805 opt_order = estimate_best_order(ref, max_order); |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
806 i = opt_order-1; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
807 quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i]); |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
808 } else { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
809 for(i=0; i<max_order; i++) { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
810 quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i]); |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
811 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
812 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
813 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
814 return opt_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
815 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
816 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
817 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
818 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
|
819 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
820 assert(n > 0); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
821 memcpy(res, smp, n * sizeof(int32_t)); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
822 } |
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 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
|
825 int order) |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
826 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
827 int i; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
828 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
829 for(i=0; i<order; i++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
830 res[i] = smp[i]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
831 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
832 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
833 if(order==0){ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
834 for(i=order; i<n; i++) |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
835 res[i]= smp[i]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
836 }else if(order==1){ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
837 for(i=order; i<n; i++) |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
838 res[i]= smp[i] - smp[i-1]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
839 }else if(order==2){ |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
840 int a = smp[order-1] - smp[order-2]; |
5739
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
841 for(i=order; i<n; i+=2) { |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
842 int b = smp[i] - smp[i-1]; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
843 res[i]= b - a; |
5739
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
844 a = smp[i+1] - smp[i]; |
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
845 res[i+1]= a - b; |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
846 } |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
847 }else if(order==3){ |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
848 int a = smp[order-1] - smp[order-2]; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
849 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
|
850 for(i=order; i<n; i+=2) { |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
851 int b = smp[i] - smp[i-1]; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
852 int d = b - a; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
853 res[i]= d - c; |
5739
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
854 a = smp[i+1] - smp[i]; |
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
855 c = a - b; |
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
856 res[i+1]= c - d; |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
857 } |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
858 }else{ |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
859 int a = smp[order-1] - smp[order-2]; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
860 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
|
861 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
|
862 for(i=order; i<n; i+=2) { |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
863 int b = smp[i] - smp[i-1]; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
864 int d = b - a; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
865 int f = d - c; |
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
866 res[i]= f - e; |
5739
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
867 a = smp[i+1] - smp[i]; |
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
868 c = a - b; |
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
869 e = c - d; |
832a3152d38e
unroll finite differences to avoid swapping registers.
lorenm
parents:
5738
diff
changeset
|
870 res[i+1]= e - f; |
5738
c1a4aae5adb4
encode_residual_fixed(): replace FIR with finite differences.
lorenm
parents:
5737
diff
changeset
|
871 } |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
872 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
873 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
874 |
5724
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
875 #define LPC1(x) {\ |
5742 | 876 int c = coefs[(x)-1];\ |
877 p0 += c*s;\ | |
878 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
|
879 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
|
880 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
881 |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
882 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
|
883 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
|
884 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
|
885 { |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
886 int i; |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
887 for(i=order; i<n; i+=2) { |
5742 | 888 int s = smp[i-order]; |
889 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
|
890 if(big) { |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
891 switch(order) { |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
892 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
|
893 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
|
894 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
|
895 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
|
896 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
|
897 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
|
898 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
|
899 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
|
900 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
|
901 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
|
902 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
|
903 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
|
904 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 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
|
910 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
|
911 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
|
912 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
|
913 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
|
914 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
|
915 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
|
916 LPC1( 8) |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
917 LPC1( 7) |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
918 LPC1( 6) |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
919 LPC1( 5) |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
920 LPC1( 4) |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
921 LPC1( 3) |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
922 LPC1( 2) |
5742 | 923 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
|
924 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
925 } else { |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
926 switch(order) { |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
927 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
|
928 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
|
929 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
|
930 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
|
931 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
|
932 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
|
933 case 2: LPC1( 2) |
5742 | 934 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
|
935 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
936 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
937 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
|
938 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
|
939 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
940 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
941 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
942 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
|
943 int order, const int32_t *coefs, int shift) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
944 { |
5724
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
945 int i; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
946 for(i=0; i<order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
947 res[i] = smp[i]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
948 } |
5724
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
949 #ifdef CONFIG_SMALL |
5720 | 950 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
|
951 int j; |
5742 | 952 int s = smp[i]; |
953 int p0 = 0, p1 = 0; | |
954 for(j=0; j<order; j++) { | |
955 int c = coefs[j]; | |
956 p1 += c*s; | |
957 s = smp[i-j-1]; | |
5720 | 958 p0 += c*s; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
959 } |
5742 | 960 res[i ] = smp[i ] - (p0 >> shift); |
5720 | 961 res[i+1] = smp[i+1] - (p1 >> shift); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
962 } |
5724
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
963 #else |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
964 switch(order) { |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
965 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
|
966 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
|
967 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
|
968 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
|
969 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
|
970 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
|
971 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
|
972 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
|
973 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
|
974 } |
96d1b6c30aad
unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order.
lorenm
parents:
5722
diff
changeset
|
975 #endif |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
976 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
977 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
978 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
|
979 { |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
980 int i, n; |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
981 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
|
982 int min_porder, max_porder; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
983 FlacFrame *frame; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
984 FlacSubframe *sub; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
985 int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
986 int shift[MAX_LPC_ORDER]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
987 int32_t *res, *smp; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
988 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
989 frame = &ctx->frame; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
990 sub = &frame->subframes[ch]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
991 res = sub->residual; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
992 smp = sub->samples; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
993 n = frame->blocksize; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
994 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
995 /* CONSTANT */ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
996 for(i=1; i<n; i++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
997 if(smp[i] != smp[0]) break; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
998 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
999 if(i == n) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1000 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
|
1001 res[0] = smp[0]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1002 return sub->obits; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1003 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1004 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1005 /* VERBATIM */ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1006 if(n < 5) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1007 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
|
1008 encode_residual_verbatim(res, smp, n); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1009 return sub->obits * n; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1010 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1011 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1012 min_order = ctx->options.min_prediction_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1013 max_order = ctx->options.max_prediction_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1014 min_porder = ctx->options.min_partition_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1015 max_porder = ctx->options.max_partition_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1016 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
|
1017 omethod = ctx->options.prediction_order_method; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1018 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1019 /* FIXED */ |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1020 if(!ctx->options.use_lpc || max_order == 0 || (n <= max_order)) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1021 uint32_t bits[MAX_FIXED_ORDER+1]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1022 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
|
1023 opt_order = 0; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1024 bits[0] = UINT32_MAX; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1025 for(i=min_order; i<=max_order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1026 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
|
1027 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
|
1028 n, i, sub->obits); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1029 if(bits[i] < bits[opt_order]) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1030 opt_order = i; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1031 } |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1032 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1033 sub->order = opt_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1034 sub->type = FLAC_SUBFRAME_FIXED; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1035 sub->type_code = sub->type | sub->order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1036 if(sub->order != max_order) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1037 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
|
1038 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
|
1039 sub->order, sub->obits); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1040 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1041 return bits[sub->order]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1042 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1043 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1044 /* LPC */ |
5737 | 1045 opt_order = lpc_calc_coefs(ctx, smp, n, max_order, precision, coefs, shift, ctx->options.use_lpc, omethod); |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1046 |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1047 if(omethod == ORDER_METHOD_2LEVEL || |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1048 omethod == ORDER_METHOD_4LEVEL || |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1049 omethod == ORDER_METHOD_8LEVEL) { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1050 int levels = 1 << omethod; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1051 uint32_t bits[levels]; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1052 int order; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1053 int opt_index = levels-1; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1054 opt_order = max_order-1; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1055 bits[opt_index] = UINT32_MAX; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1056 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
|
1057 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
|
1058 if(order < 0) order = 0; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1059 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
|
1060 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
|
1061 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
|
1062 if(bits[i] < bits[opt_index]) { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1063 opt_index = i; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1064 opt_order = order; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1065 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1066 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1067 opt_order++; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1068 } else if(omethod == ORDER_METHOD_SEARCH) { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1069 // brute-force optimal order search |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1070 uint32_t bits[MAX_LPC_ORDER]; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1071 opt_order = 0; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1072 bits[0] = UINT32_MAX; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1073 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
|
1074 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
|
1075 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
|
1076 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
|
1077 if(bits[i] < bits[opt_order]) { |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1078 opt_order = i; |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1079 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1080 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1081 opt_order++; |
3478 | 1082 } else if(omethod == ORDER_METHOD_LOG) { |
1083 uint32_t bits[MAX_LPC_ORDER]; | |
1084 int step; | |
1085 | |
1086 opt_order= min_order - 1 + (max_order-min_order)/3; | |
1087 memset(bits, -1, sizeof(bits)); | |
1088 | |
1089 for(step=16 ;step; step>>=1){ | |
1090 int last= opt_order; | |
1091 for(i=last-step; i<=last+step; i+= step){ | |
1092 if(i<min_order-1 || i>=max_order || bits[i] < UINT32_MAX) | |
1093 continue; | |
1094 encode_residual_lpc(res, smp, n, i+1, coefs[i], shift[i]); | |
1095 bits[i] = calc_rice_params_lpc(&sub->rc, min_porder, max_porder, | |
1096 res, n, i+1, sub->obits, precision); | |
1097 if(bits[i] < bits[opt_order]) | |
1098 opt_order= i; | |
1099 } | |
1100 } | |
1101 opt_order++; | |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1102 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1103 |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
1104 sub->order = opt_order; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1105 sub->type = FLAC_SUBFRAME_LPC; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1106 sub->type_code = sub->type | (sub->order-1); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1107 sub->shift = shift[sub->order-1]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1108 for(i=0; i<sub->order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1109 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
|
1110 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1111 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
|
1112 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
|
1113 sub->obits, precision); |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1114 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1115 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1116 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
|
1117 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1118 int i, n; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1119 FlacFrame *frame; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1120 FlacSubframe *sub; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1121 int32_t *res, *smp; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1122 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1123 frame = &ctx->frame; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1124 sub = &frame->subframes[ch]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1125 res = sub->residual; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1126 smp = sub->samples; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1127 n = frame->blocksize; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1128 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1129 /* CONSTANT */ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1130 for(i=1; i<n; i++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1131 if(smp[i] != smp[0]) break; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1132 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1133 if(i == n) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1134 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
|
1135 res[0] = smp[0]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1136 return sub->obits; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1137 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1138 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1139 /* VERBATIM */ |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1140 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
|
1141 encode_residual_verbatim(res, smp, n); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1142 return sub->obits * n; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1143 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1144 |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1145 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
|
1146 { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1147 int i, best; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1148 int32_t lt, rt; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1149 uint64_t sum[4]; |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1150 uint64_t score[4]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1151 int k; |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1152 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1153 /* 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
|
1154 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
|
1155 for(i=2; i<n; i++) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1156 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
|
1157 rt = right_ch[i] - 2*right_ch[i-1] + right_ch[i-2]; |
4001 | 1158 sum[2] += FFABS((lt + rt) >> 1); |
1159 sum[3] += FFABS(lt - rt); | |
1160 sum[0] += FFABS(lt); | |
1161 sum[1] += FFABS(rt); | |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1162 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1163 /* estimate bit counts */ |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1164 for(i=0; i<4; i++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1165 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
|
1166 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
|
1167 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1168 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1169 /* calculate score for each mode */ |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1170 score[0] = sum[0] + sum[1]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1171 score[1] = sum[0] + sum[3]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1172 score[2] = sum[1] + sum[3]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1173 score[3] = sum[2] + sum[3]; |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1174 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1175 /* return mode with lowest score */ |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1176 best = 0; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1177 for(i=1; i<4; i++) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1178 if(score[i] < score[best]) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1179 best = i; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1180 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1181 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1182 if(best == 0) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1183 return FLAC_CHMODE_LEFT_RIGHT; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1184 } else if(best == 1) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1185 return FLAC_CHMODE_LEFT_SIDE; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1186 } else if(best == 2) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1187 return FLAC_CHMODE_RIGHT_SIDE; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1188 } else { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1189 return FLAC_CHMODE_MID_SIDE; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1190 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1191 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1192 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1193 /** |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1194 * Perform stereo channel decorrelation |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1195 */ |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1196 static void channel_decorrelation(FlacEncodeContext *ctx) |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1197 { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1198 FlacFrame *frame; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1199 int32_t *left, *right; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1200 int i, n; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1201 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1202 frame = &ctx->frame; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1203 n = frame->blocksize; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1204 left = frame->subframes[0].samples; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1205 right = frame->subframes[1].samples; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1206 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1207 if(ctx->channels != 2) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1208 frame->ch_mode = FLAC_CHMODE_NOT_STEREO; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1209 return; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1210 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1211 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1212 frame->ch_mode = estimate_stereo_mode(left, right, n); |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1213 |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1214 /* perform decorrelation and adjust bits-per-sample */ |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1215 if(frame->ch_mode == FLAC_CHMODE_LEFT_RIGHT) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1216 return; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1217 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1218 if(frame->ch_mode == FLAC_CHMODE_MID_SIDE) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1219 int32_t tmp; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1220 for(i=0; i<n; i++) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1221 tmp = left[i]; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1222 left[i] = (tmp + right[i]) >> 1; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1223 right[i] = tmp - right[i]; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1224 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1225 frame->subframes[1].obits++; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1226 } else if(frame->ch_mode == FLAC_CHMODE_LEFT_SIDE) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1227 for(i=0; i<n; i++) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1228 right[i] = left[i] - right[i]; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1229 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1230 frame->subframes[1].obits++; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1231 } else { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1232 for(i=0; i<n; i++) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1233 left[i] -= right[i]; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1234 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1235 frame->subframes[0].obits++; |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1236 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1237 } |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1238 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1239 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
|
1240 { |
4149
3118e8afb8a5
Fix ASF format parser's broken UTF-16 string handling
gpoirier
parents:
4001
diff
changeset
|
1241 uint8_t tmp; |
3118e8afb8a5
Fix ASF format parser's broken UTF-16 string handling
gpoirier
parents:
4001
diff
changeset
|
1242 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
|
1243 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1244 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1245 static void output_frame_header(FlacEncodeContext *s) |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1246 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1247 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1248 int crc; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1249 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1250 frame = &s->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1251 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1252 put_bits(&s->pb, 16, 0xFFF8); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1253 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
|
1254 put_bits(&s->pb, 4, s->sr_code[0]); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1255 if(frame->ch_mode == FLAC_CHMODE_NOT_STEREO) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1256 put_bits(&s->pb, 4, s->ch_code); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1257 } else { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1258 put_bits(&s->pb, 4, frame->ch_mode); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1259 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1260 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
|
1261 put_bits(&s->pb, 1, 0); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1262 write_utf8(&s->pb, s->frame_count); |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1263 if(frame->bs_code[0] == 6) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1264 put_bits(&s->pb, 8, frame->bs_code[1]); |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1265 } else if(frame->bs_code[0] == 7) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1266 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
|
1267 } |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1268 if(s->sr_code[0] == 12) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1269 put_bits(&s->pb, 8, s->sr_code[1]); |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1270 } else if(s->sr_code[0] > 12) { |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1271 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
|
1272 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1273 flush_put_bits(&s->pb); |
6108 | 1274 crc = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, |
1275 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
|
1276 put_bits(&s->pb, 8, crc); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1277 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1278 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1279 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
|
1280 { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1281 FlacSubframe *sub; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1282 int32_t res; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1283 |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1284 sub = &s->frame.subframes[ch]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1285 res = sub->residual[0]; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1286 put_sbits(&s->pb, sub->obits, res); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1287 } |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1288 |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1289 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
|
1290 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1291 int i; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1292 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1293 FlacSubframe *sub; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1294 int32_t res; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1295 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1296 frame = &s->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1297 sub = &frame->subframes[ch]; |
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 for(i=0; i<frame->blocksize; i++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1300 res = sub->residual[i]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1301 put_sbits(&s->pb, sub->obits, res); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1302 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1303 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1304 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1305 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
|
1306 { |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1307 int i, j, p, n, parts; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1308 int k, porder, psize, res_cnt; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1309 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1310 FlacSubframe *sub; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1311 int32_t *res; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1312 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1313 frame = &ctx->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1314 sub = &frame->subframes[ch]; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1315 res = sub->residual; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1316 n = frame->blocksize; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1317 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1318 /* rice-encoded block */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1319 put_bits(&ctx->pb, 2, 0); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1320 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1321 /* partition order */ |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1322 porder = sub->rc.porder; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1323 psize = n >> porder; |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1324 parts = (1 << porder); |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1325 put_bits(&ctx->pb, 4, porder); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1326 res_cnt = psize - sub->order; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1327 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1328 /* residual */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1329 j = sub->order; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1330 for(p=0; p<parts; p++) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1331 k = sub->rc.params[p]; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1332 put_bits(&ctx->pb, 4, k); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1333 if(p == 1) res_cnt = psize; |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1334 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
|
1335 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
|
1336 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1337 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1338 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1339 |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1340 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
|
1341 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1342 int i; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1343 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1344 FlacSubframe *sub; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1345 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1346 frame = &ctx->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1347 sub = &frame->subframes[ch]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1348 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1349 /* warm-up samples */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1350 for(i=0; i<sub->order; i++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1351 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
|
1352 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1353 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1354 /* residual */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1355 output_residual(ctx, ch); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1356 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1357 |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1358 static void output_subframe_lpc(FlacEncodeContext *ctx, int ch) |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1359 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1360 int i, cbits; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1361 FlacFrame *frame; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1362 FlacSubframe *sub; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1363 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1364 frame = &ctx->frame; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1365 sub = &frame->subframes[ch]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1366 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1367 /* warm-up samples */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1368 for(i=0; i<sub->order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1369 put_sbits(&ctx->pb, sub->obits, sub->residual[i]); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1370 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1371 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1372 /* LPC coefficients */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1373 cbits = ctx->options.lpc_coeff_precision; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1374 put_bits(&ctx->pb, 4, cbits-1); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1375 put_sbits(&ctx->pb, 5, sub->shift); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1376 for(i=0; i<sub->order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1377 put_sbits(&ctx->pb, cbits, sub->coefs[i]); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1378 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1379 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1380 /* residual */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1381 output_residual(ctx, ch); |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1382 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1383 |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1384 static void output_subframes(FlacEncodeContext *s) |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1385 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1386 FlacFrame *frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1387 FlacSubframe *sub; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1388 int ch; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1389 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1390 frame = &s->frame; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1391 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1392 for(ch=0; ch<s->channels; ch++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1393 sub = &frame->subframes[ch]; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1394 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1395 /* subframe header */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1396 put_bits(&s->pb, 1, 0); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1397 put_bits(&s->pb, 6, sub->type_code); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1398 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
|
1399 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1400 /* subframe */ |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1401 if(sub->type == FLAC_SUBFRAME_CONSTANT) { |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1402 output_subframe_constant(s, ch); |
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1403 } else if(sub->type == FLAC_SUBFRAME_VERBATIM) { |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1404 output_subframe_verbatim(s, ch); |
3365
84f29207af3a
flacenc - rice param search patch by (Justin Ruggles jruggle earthlink net
michael
parents:
3358
diff
changeset
|
1405 } else if(sub->type == FLAC_SUBFRAME_FIXED) { |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1406 output_subframe_fixed(s, ch); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1407 } else if(sub->type == FLAC_SUBFRAME_LPC) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
1408 output_subframe_lpc(s, ch); |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1409 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1410 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1411 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1412 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1413 static void output_frame_footer(FlacEncodeContext *s) |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1414 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1415 int crc; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1416 flush_put_bits(&s->pb); |
6108 | 1417 crc = bswap_16(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, |
1418 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
|
1419 put_bits(&s->pb, 16, crc); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1420 flush_put_bits(&s->pb); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1421 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1422 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1423 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
|
1424 int buf_size, void *data) |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1425 { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1426 int ch; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1427 FlacEncodeContext *s; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1428 int16_t *samples = data; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1429 int out_bytes; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1430 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1431 s = avctx->priv_data; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1432 |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1433 init_frame(s); |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1434 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1435 copy_samples(s, samples); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1436 |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1437 channel_decorrelation(s); |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1438 |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1439 for(ch=0; ch<s->channels; ch++) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1440 encode_residual(s, ch); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1441 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1442 init_put_bits(&s->pb, frame, buf_size); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1443 output_frame_header(s); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1444 output_subframes(s); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1445 output_frame_footer(s); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1446 out_bytes = put_bits_count(&s->pb) >> 3; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1447 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1448 if(out_bytes > s->max_framesize || out_bytes >= buf_size) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1449 /* frame too large. use verbatim mode */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1450 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
|
1451 encode_residual_v(s, ch); |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1452 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1453 init_put_bits(&s->pb, frame, buf_size); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1454 output_frame_header(s); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1455 output_subframes(s); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1456 output_frame_footer(s); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1457 out_bytes = put_bits_count(&s->pb) >> 3; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1458 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1459 if(out_bytes > s->max_framesize || out_bytes >= buf_size) { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1460 /* still too large. must be an error. */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1461 av_log(avctx, AV_LOG_ERROR, "error encoding frame\n"); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1462 return -1; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1463 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1464 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1465 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1466 s->frame_count++; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1467 return out_bytes; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1468 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1469 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6341
diff
changeset
|
1470 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
|
1471 { |
3358
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1472 av_freep(&avctx->extradata); |
4ae69b5b596b
stereo decorrelation support by (Justin Ruggles jruggle earthlink net>)
michael
parents:
3357
diff
changeset
|
1473 avctx->extradata_size = 0; |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1474 av_freep(&avctx->coded_frame); |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1475 return 0; |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1476 } |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1477 |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1478 AVCodec flac_encoder = { |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1479 "flac", |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1480 CODEC_TYPE_AUDIO, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1481 CODEC_ID_FLAC, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1482 sizeof(FlacEncodeContext), |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1483 flac_encode_init, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1484 flac_encode_frame, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1485 flac_encode_close, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1486 NULL, |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1487 .capabilities = CODEC_CAP_SMALL_LAST_FRAME, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6763
diff
changeset
|
1488 .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
|
1489 }; |