X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fmain.c;h=6ffb7b197cc6228a6fbc5d18d2f9f5fd0433ac98;hb=f75c9c7b3e90df13b91f3de94c6374c58e4c3d52;hp=89af78e644bbb78566fc82cb08f8e9d9e6514897;hpb=a7e00a42195bd01fad75e5800fcbadeb1a5d3efd;p=fdkaac.git diff --git a/src/main.c b/src/main.c index 89af78e..6ffb7b1 100644 --- a/src/main.c +++ b/src/main.c @@ -563,11 +563,20 @@ int encode(aacenc_param_ex_t *params, pcm_reader_t *reader, ++encoded; if (encoded == 1 || encoded == 3) continue; - obp = &obuf[flip]; - if (write_sample(params->output_fp, m4af, obp) < 0) + + if (write_sample(params->output_fp, m4af, &obuf[flip]) < 0) goto END; ++frames_written; } while (remaining > 0); + /* + * When interrupted, we haven't pulled out last extrapolated frames + * from the reader. Therefore, we have to write the final outcome. + */ + if (g_interrupted) { + if (write_sample(params->output_fp, m4af, &obp[flip^1]) < 0) + goto END; + ++frames_written; + } } DONE: if (!params->silent) @@ -698,7 +707,7 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params) if ((params->input_fp = aacenc_fopen(params->input_filename, "rb")) == 0) { aacenc_fprintf(stderr, "ERROR: %s: %s\n", params->input_filename, strerror(errno)); - goto END; + goto FAIL; } io.cookie = params->input_fp; if (fstat(fileno(params->input_fp), &stb) == 0 @@ -712,7 +721,7 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params) pcm_sample_description_t desc = { 0 }; if (parse_raw_spec(params->raw_format, &desc) < 0) { fprintf(stderr, "ERROR: invalid raw-format spec\n"); - goto END; + goto FAIL; } desc.sample_rate = params->raw_rate; desc.channels_per_frame = params->raw_channels; @@ -720,7 +729,7 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params) desc.bytes_per_frame = params->raw_channels * bytes_per_channel; if ((reader = raw_open(&io, &desc)) == 0) { fprintf(stderr, "ERROR: failed to open raw input\n"); - goto END; + goto FAIL; } } else { int c; @@ -730,7 +739,7 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params) case 'R': if ((reader = wav_open(&io, params->ignore_length)) == 0) { fprintf(stderr, "ERROR: broken / unsupported input file\n"); - goto END; + goto FAIL; } break; case 'c': @@ -740,19 +749,21 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params) aacenc_translate_generic_text_tag, ¶ms->source_tag_ctx)) == 0) { fprintf(stderr, "ERROR: broken / unsupported input file\n"); - goto END; + goto FAIL; } break; default: fprintf(stderr, "ERROR: unsupported input file\n"); - goto END; + goto FAIL; } } - if ((reader = pcm_open_native_converter(reader)) != 0) - if ((reader = pcm_open_sint16_converter(reader)) != 0) - reader = extrapolater_open(reader); + reader = pcm_open_native_converter(reader); + if (reader && PCM_IS_FLOAT(pcm_get_format(reader))) + reader = limiter_open(reader); + if (reader && (reader = pcm_open_sint16_converter(reader)) != 0) + reader = extrapolater_open(reader); return reader; -END: +FAIL: return 0; } @@ -822,6 +833,7 @@ int main(int argc, char **argv) if ((m4af = m4af_create(M4AF_CODEC_MP4A, scale, &m4af_io, params.output_fp)) < 0) goto END; + m4af_set_num_channels(m4af, 0, sample_format->channels_per_frame); m4af_set_decoder_specific_info(m4af, 0, aacinfo.confBuf, aacinfo.confSize); m4af_set_fixed_frame_duration(m4af, 0, framelen >> scale_shift);