aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Liu <lq@chinaffmpeg.org>2019-08-21 19:34:28 +0800
committerSteven Liu <lq@chinaffmpeg.org>2019-08-26 11:08:52 +0800
commit7c2ff06b6e6aee9ddb6f4e4bddb1fa5f2ccc1885 (patch)
tree5584c9547d20fe6fc6f635fc4227a0ee448d71f0
parent17576fda6546afc818fe88efb62bb7a097c19e96 (diff)
downloadffmpeg-7c2ff06b6e6aee9ddb6f4e4bddb1fa5f2ccc1885.tar.gz
doc/examples/decode_audio: print message about how to play the output file
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
-rw-r--r--doc/examples/decode_audio.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/doc/examples/decode_audio.c b/doc/examples/decode_audio.c
index 19dcafd2c8..6f589b9878 100644
--- a/doc/examples/decode_audio.c
+++ b/doc/examples/decode_audio.c
@@ -39,6 +39,35 @@
#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096
+static int get_format_from_sample_fmt(const char **fmt,
+ enum AVSampleFormat sample_fmt)
+{
+ int i;
+ struct sample_fmt_entry {
+ enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le;
+ } sample_fmt_entries[] = {
+ { AV_SAMPLE_FMT_U8, "u8", "u8" },
+ { AV_SAMPLE_FMT_S16, "s16be", "s16le" },
+ { AV_SAMPLE_FMT_S32, "s32be", "s32le" },
+ { AV_SAMPLE_FMT_FLT, "f32be", "f32le" },
+ { AV_SAMPLE_FMT_DBL, "f64be", "f64le" },
+ };
+ *fmt = NULL;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) {
+ struct sample_fmt_entry *entry = &sample_fmt_entries[i];
+ if (sample_fmt == entry->sample_fmt) {
+ *fmt = AV_NE(entry->fmt_be, entry->fmt_le);
+ return 0;
+ }
+ }
+
+ fprintf(stderr,
+ "sample format %s is not supported as output format\n",
+ av_get_sample_fmt_name(sample_fmt));
+ return -1;
+}
+
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
FILE *outfile)
{
@@ -172,6 +201,28 @@ int main(int argc, char **argv)
pkt->size = 0;
decode(c, pkt, decoded_frame, outfile);
+ /* print output pcm infomations, because there have no metadata of pcm */
+ enum AVSampleFormat sfmt = c->sample_fmt;
+ int n_channels = 0;
+ const char *fmt;
+
+ if (av_sample_fmt_is_planar(sfmt)) {
+ const char *packed = av_get_sample_fmt_name(sfmt);
+ printf("Warning: the sample format the decoder produced is planar "
+ "(%s). This example will output the first channel only.\n",
+ packed ? packed : "?");
+ sfmt = av_get_packed_sample_fmt(sfmt);
+ }
+
+ n_channels = c->channels;
+ if ((ret = get_format_from_sample_fmt(&fmt, sfmt)) < 0)
+ goto end;
+
+ printf("Play the output audio file with the command:\n"
+ "ffplay -f %s -ac %d -ar %d %s\n",
+ fmt, n_channels, c->sample_rate,
+ outfilename);
+end:
fclose(outfile);
fclose(f);