Remove duplicate code by adding a flag for encoding in verbatim mode.

Originally committed as revision 24621 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Justin Ruggles 2010-07-31 16:46:32 +00:00
parent 05236ed735
commit 0f5cc12c4f
1 changed files with 6 additions and 34 deletions

View File

@ -77,6 +77,7 @@ typedef struct FlacFrame {
int bs_code[2]; int bs_code[2];
uint8_t crc8; uint8_t crc8;
int ch_mode; int ch_mode;
int verbatim_only;
} FlacFrame; } FlacFrame;
typedef struct FlacEncodeContext { typedef struct FlacEncodeContext {
@ -472,6 +473,8 @@ static void init_frame(FlacEncodeContext *s)
for (ch = 0; ch < s->channels; ch++) for (ch = 0; ch < s->channels; ch++)
frame->subframes[ch].obits = 16; frame->subframes[ch].obits = 16;
frame->verbatim_only = 0;
} }
@ -819,7 +822,7 @@ static int encode_residual_ch(FlacEncodeContext *s, int ch)
} }
/* VERBATIM */ /* VERBATIM */
if (n < 5) { if (frame->verbatim_only || n < 5) {
sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM; sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM;
encode_residual_verbatim(res, smp, n); encode_residual_verbatim(res, smp, n);
return sub->obits * n; return sub->obits * n;
@ -985,36 +988,6 @@ static int encode_frame(FlacEncodeContext *s)
} }
static int encode_residual_v(FlacEncodeContext *s, int ch)
{
int i, n;
FlacFrame *frame;
FlacSubframe *sub;
int32_t *res, *smp;
frame = &s->frame;
sub = &frame->subframes[ch];
res = sub->residual;
smp = sub->samples;
n = frame->blocksize;
/* CONSTANT */
for (i = 1; i < n; i++)
if (smp[i] != smp[0])
break;
if (i == n) {
sub->type = sub->type_code = FLAC_SUBFRAME_CONSTANT;
res[0] = smp[0];
return sub->obits;
}
/* VERBATIM */
sub->type = sub->type_code = FLAC_SUBFRAME_VERBATIM;
encode_residual_verbatim(res, smp, n);
return sub->obits * n;
}
static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n) static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n)
{ {
int i, best; int i, best;
@ -1236,7 +1209,6 @@ static void update_md5_sum(FlacEncodeContext *s, const int16_t *samples)
static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame, static int flac_encode_frame(AVCodecContext *avctx, uint8_t *frame,
int buf_size, void *data) int buf_size, void *data)
{ {
int ch;
FlacEncodeContext *s; FlacEncodeContext *s;
const int16_t *samples = data; const int16_t *samples = data;
int out_bytes; int out_bytes;
@ -1280,8 +1252,8 @@ write_frame:
} }
/* frame too large. use verbatim mode */ /* frame too large. use verbatim mode */
for (ch = 0; ch < s->channels; ch++) s->frame.verbatim_only = 1;
encode_residual_v(s, ch); encode_frame(s);
reencoded = 1; reencoded = 1;
goto write_frame; goto write_frame;
} }