diff --git a/ffmpeg.c b/ffmpeg.c index a17eb216b9..e1409872e9 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -96,6 +96,7 @@ static char *str_author = NULL; static char *str_copyright = NULL; static char *str_comment = NULL; static int do_benchmark = 0; +static int do_hex_dump = 0; typedef struct AVOutputStream { int file_index; /* file index */ @@ -648,7 +649,7 @@ static void do_audio_out(AVFormatContext *s, } /* now encode as many frames as possible */ - if (enc->codec_id != CODEC_ID_PCM) { + if (enc->frame_size > 1) { /* output resampled raw samples */ fifo_write(&ost->fifo, buftmp, size_out, &ost->fifo.wptr); @@ -657,13 +658,26 @@ static void do_audio_out(AVFormatContext *s, while (fifo_read(&ost->fifo, audio_buf, frame_bytes, &ost->fifo.rptr) == 0) { - ret = avcodec_encode_audio(enc, - audio_out, sizeof(audio_out), (short *)audio_buf); + ret = avcodec_encode_audio(enc, audio_out, sizeof(audio_out), + (short *)audio_buf); s->format->write_packet(s, ost->index, audio_out, ret); } } else { - /* XXX: handle endianness */ - s->format->write_packet(s, ost->index, buftmp, size_out); + /* output a pcm frame */ + /* XXX: change encoding codec API to avoid this ? */ + switch(enc->codec->id) { + case CODEC_ID_PCM_S16LE: + case CODEC_ID_PCM_S16BE: + case CODEC_ID_PCM_U16LE: + case CODEC_ID_PCM_U16BE: + break; + default: + size_out = size_out >> 1; + break; + } + ret = avcodec_encode_audio(enc, audio_out, size_out, + (short *)buftmp); + s->format->write_packet(s, ost->index, audio_out, ret); } } @@ -860,9 +874,6 @@ static void do_video_out(AVFormatContext *s, free(buf1); } -//#define HEX_DUMP - -#ifdef HEX_DUMP static void hex_dump(UINT8 *buf, int size) { int len, i, j, c; @@ -888,7 +899,6 @@ static void hex_dump(UINT8 *buf, int size) printf("\n"); } } -#endif /* * The following code is the main loop of the file converter @@ -1191,10 +1201,10 @@ static int av_encode(AVFormatContext **output_files, continue; } -#ifdef HEX_DUMP - printf("stream #%d, size=%d:\n", pkt.stream_index, pkt.size); - hex_dump(pkt.data, pkt.size); -#endif + if (do_hex_dump) { + printf("stream #%d, size=%d:\n", pkt.stream_index, pkt.size); + hex_dump(pkt.data, pkt.size); + } // printf("read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size); @@ -1208,24 +1218,19 @@ static int av_encode(AVFormatContext **output_files, if (ist->decoding_needed) { switch(ist->st->codec.codec_type) { case CODEC_TYPE_AUDIO: - if (ist->st->codec.codec_id == CODEC_ID_PCM) { - /* no need to call a codec */ - data_buf = ptr; - data_size = len; - ret = len; - } else { - ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size, - ptr, len); - if (ret < 0) - goto fail_decode; - if (data_size == 0) { - /* no audio frame */ - ptr += ret; - len -= ret; - continue; - } - data_buf = (UINT8 *)samples; + /* XXX: could avoid copy if PCM 16 bits with same + endianness as CPU */ + ret = avcodec_decode_audio(&ist->st->codec, samples, &data_size, + ptr, len); + if (ret < 0) + goto fail_decode; + if (data_size == 0) { + /* no audio frame */ + ptr += ret; + len -= ret; + continue; } + data_buf = (UINT8 *)samples; break; case CODEC_TYPE_VIDEO: if (ist->st->codec.codec_id == CODEC_ID_RAWVIDEO) { @@ -2230,6 +2235,8 @@ const OptionDef options[] = { "deinterlace pictures" }, { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark}, "add timings for benchmarking" }, + { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump}, + "dump each input packet" }, { NULL, }, };