Mercurial > libavcodec.hg
comparison flacenc.c @ 12311:1a4351501522 libavcodec
Combine output_subframe_verbatim() and output_subframe_lpc().
author | jbr |
---|---|
date | Fri, 30 Jul 2010 21:06:38 +0000 |
parents | eba0e28f6dbc |
children | 4f7ed0667a27 |
comparison
equal
deleted
inserted
replaced
12310:eba0e28f6dbc | 12311:1a4351501522 |
---|---|
1099 put_bits_count(&s->pb) >> 3); | 1099 put_bits_count(&s->pb) >> 3); |
1100 put_bits(&s->pb, 8, crc); | 1100 put_bits(&s->pb, 8, crc); |
1101 } | 1101 } |
1102 | 1102 |
1103 | 1103 |
1104 static void output_subframe_verbatim(FlacEncodeContext *s, FlacSubframe *sub) | 1104 static void output_subframe(FlacEncodeContext *s, FlacSubframe *sub) |
1105 { | |
1106 put_sbits(&s->pb, sub->obits, sub->residual[0]); | |
1107 | |
1108 if (sub->type == FLAC_SUBFRAME_VERBATIM) { | |
1109 int i; | |
1110 for (i = 0; i < s->frame.blocksize; i++) | |
1111 put_sbits(&s->pb, sub->obits, sub->residual[i]); | |
1112 } | |
1113 } | |
1114 | |
1115 | |
1116 static void output_subframe_lpc(FlacEncodeContext *s, FlacSubframe *sub) | |
1117 { | 1105 { |
1118 int i, p, porder, psize; | 1106 int i, p, porder, psize; |
1119 int32_t *res, *part_end, *frame_end; | 1107 int32_t *part_end; |
1120 | 1108 int32_t *res = sub->residual; |
1109 int32_t *frame_end = &sub->residual[s->frame.blocksize]; | |
1110 | |
1111 if (sub->type == FLAC_SUBFRAME_CONSTANT) { | |
1112 put_sbits(&s->pb, sub->obits, res[0]); | |
1113 } else if (sub->type == FLAC_SUBFRAME_VERBATIM) { | |
1114 while (res < frame_end) | |
1115 put_sbits(&s->pb, sub->obits, *res++); | |
1116 } else { | |
1121 /* warm-up samples */ | 1117 /* warm-up samples */ |
1122 res = sub->residual; | |
1123 for (i = 0; i < sub->order; i++) | 1118 for (i = 0; i < sub->order; i++) |
1124 put_sbits(&s->pb, sub->obits, *res++); | 1119 put_sbits(&s->pb, sub->obits, *res++); |
1125 | 1120 |
1126 /* LPC coefficients */ | 1121 /* LPC coefficients */ |
1127 if (sub->type == FLAC_SUBFRAME_LPC) { | 1122 if (sub->type == FLAC_SUBFRAME_LPC) { |
1140 psize = s->frame.blocksize >> porder; | 1135 psize = s->frame.blocksize >> porder; |
1141 put_bits(&s->pb, 4, porder); | 1136 put_bits(&s->pb, 4, porder); |
1142 | 1137 |
1143 /* residual */ | 1138 /* residual */ |
1144 part_end = &sub->residual[psize ]; | 1139 part_end = &sub->residual[psize ]; |
1145 frame_end = &sub->residual[s->frame.blocksize]; | |
1146 for (p = 0; p < 1 << porder; p++) { | 1140 for (p = 0; p < 1 << porder; p++) { |
1147 int k = sub->rc.params[p]; | 1141 int k = sub->rc.params[p]; |
1148 put_bits(&s->pb, 4, k); | 1142 put_bits(&s->pb, 4, k); |
1149 while (res < part_end) | 1143 while (res < part_end) |
1150 set_sr_golomb_flac(&s->pb, *res++, k, INT32_MAX, 0); | 1144 set_sr_golomb_flac(&s->pb, *res++, k, INT32_MAX, 0); |
1151 part_end = FFMIN(frame_end, part_end + psize); | 1145 part_end = FFMIN(frame_end, part_end + psize); |
1152 } | 1146 } |
1147 } | |
1153 } | 1148 } |
1154 | 1149 |
1155 | 1150 |
1156 static void output_subframes(FlacEncodeContext *s) | 1151 static void output_subframes(FlacEncodeContext *s) |
1157 { | 1152 { |
1168 put_bits(&s->pb, 1, 0); | 1163 put_bits(&s->pb, 1, 0); |
1169 put_bits(&s->pb, 6, sub->type_code); | 1164 put_bits(&s->pb, 6, sub->type_code); |
1170 put_bits(&s->pb, 1, 0); /* no wasted bits */ | 1165 put_bits(&s->pb, 1, 0); /* no wasted bits */ |
1171 | 1166 |
1172 /* subframe */ | 1167 /* subframe */ |
1173 switch (sub->type) { | 1168 output_subframe(s, sub); |
1174 case FLAC_SUBFRAME_CONSTANT: | |
1175 case FLAC_SUBFRAME_VERBATIM: output_subframe_verbatim(s, sub); break; | |
1176 case FLAC_SUBFRAME_FIXED: | |
1177 case FLAC_SUBFRAME_LPC: output_subframe_lpc( s, sub); break; | |
1178 } | |
1179 } | 1169 } |
1180 } | 1170 } |
1181 | 1171 |
1182 | 1172 |
1183 static void output_frame_footer(FlacEncodeContext *s) | 1173 static void output_frame_footer(FlacEncodeContext *s) |