aboutsummaryrefslogtreecommitdiff
path: root/Music/ffmpeg/doc/examples
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2021-01-03 02:06:58 +0100
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2021-01-03 02:52:19 +0100
commit734eee1af2c21976e8f57c4ca498593a305fb22e (patch)
tree8d5593567ce80c37820ea0c5ae76ff6bdb9e529c /Music/ffmpeg/doc/examples
parentbe200a681bed14801bb564c79f70e773e44e6c73 (diff)
downloadairport-734eee1af2c21976e8f57c4ca498593a305fb22e.tar.gz
Remove ffmpeg binary from project
Diffstat (limited to 'Music/ffmpeg/doc/examples')
-rw-r--r--Music/ffmpeg/doc/examples/Makefile46
-rw-r--r--Music/ffmpeg/doc/examples/README23
-rw-r--r--Music/ffmpeg/doc/examples/avio_dir_cmd.c180
-rw-r--r--Music/ffmpeg/doc/examples/avio_reading.c134
-rw-r--r--Music/ffmpeg/doc/examples/decoding_encoding.c665
-rw-r--r--Music/ffmpeg/doc/examples/demuxing_decoding.c394
-rw-r--r--Music/ffmpeg/doc/examples/extract_mvs.c185
-rw-r--r--Music/ffmpeg/doc/examples/filter_audio.c365
-rw-r--r--Music/ffmpeg/doc/examples/filtering_audio.c295
-rw-r--r--Music/ffmpeg/doc/examples/filtering_video.c280
-rw-r--r--Music/ffmpeg/doc/examples/http_multiclient.c155
-rw-r--r--Music/ffmpeg/doc/examples/metadata.c56
-rw-r--r--Music/ffmpeg/doc/examples/muxing.c673
-rw-r--r--Music/ffmpeg/doc/examples/qsvdec.c487
-rw-r--r--Music/ffmpeg/doc/examples/remuxing.c165
-rw-r--r--Music/ffmpeg/doc/examples/resampling_audio.c214
-rw-r--r--Music/ffmpeg/doc/examples/scaling_video.c140
-rw-r--r--Music/ffmpeg/doc/examples/transcode_aac.c802
-rw-r--r--Music/ffmpeg/doc/examples/transcoding.c585
19 files changed, 0 insertions, 5844 deletions
diff --git a/Music/ffmpeg/doc/examples/Makefile b/Music/ffmpeg/doc/examples/Makefile
deleted file mode 100644
index af38159..0000000
--- a/Music/ffmpeg/doc/examples/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-# use pkg-config for getting CFLAGS and LDLIBS
-FFMPEG_LIBS= libavdevice \
- libavformat \
- libavfilter \
- libavcodec \
- libswresample \
- libswscale \
- libavutil \
-
-CFLAGS += -Wall -g
-CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
-LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
-
-EXAMPLES= avio_dir_cmd \
- avio_reading \
- decoding_encoding \
- demuxing_decoding \
- extract_mvs \
- filtering_video \
- filtering_audio \
- http_multiclient \
- metadata \
- muxing \
- remuxing \
- resampling_audio \
- scaling_video \
- transcode_aac \
- transcoding \
-
-OBJS=$(addsuffix .o,$(EXAMPLES))
-
-# the following examples make explicit use of the math library
-avcodec: LDLIBS += -lm
-decoding_encoding: LDLIBS += -lm
-muxing: LDLIBS += -lm
-resampling_audio: LDLIBS += -lm
-
-.phony: all clean-test clean
-
-all: $(OBJS) $(EXAMPLES)
-
-clean-test:
- $(RM) test*.pgm test.h264 test.mp2 test.sw test.mpg
-
-clean: clean-test
- $(RM) $(EXAMPLES) $(OBJS)
diff --git a/Music/ffmpeg/doc/examples/README b/Music/ffmpeg/doc/examples/README
deleted file mode 100644
index c1ce619..0000000
--- a/Music/ffmpeg/doc/examples/README
+++ /dev/null
@@ -1,23 +0,0 @@
-FFmpeg examples README
-----------------------
-
-Both following use cases rely on pkg-config and make, thus make sure
-that you have them installed and working on your system.
-
-
-Method 1: build the installed examples in a generic read/write user directory
-
-Copy to a read/write user directory and just use "make", it will link
-to the libraries on your system, assuming the PKG_CONFIG_PATH is
-correctly configured.
-
-Method 2: build the examples in-tree
-
-Assuming you are in the source FFmpeg checkout directory, you need to build
-FFmpeg (no need to make install in any prefix). Then just run "make examples".
-This will build the examples using the FFmpeg build system. You can clean those
-examples using "make examplesclean"
-
-If you want to try the dedicated Makefile examples (to emulate the first
-method), go into doc/examples and run a command such as
-PKG_CONFIG_PATH=pc-uninstalled make.
diff --git a/Music/ffmpeg/doc/examples/avio_dir_cmd.c b/Music/ffmpeg/doc/examples/avio_dir_cmd.c
deleted file mode 100644
index 50c435c..0000000
--- a/Music/ffmpeg/doc/examples/avio_dir_cmd.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2014 Lukasz Marek
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libavformat/avio.h>
-
-static const char *type_string(int type)
-{
- switch (type) {
- case AVIO_ENTRY_DIRECTORY:
- return "<DIR>";
- case AVIO_ENTRY_FILE:
- return "<FILE>";
- case AVIO_ENTRY_BLOCK_DEVICE:
- return "<BLOCK DEVICE>";
- case AVIO_ENTRY_CHARACTER_DEVICE:
- return "<CHARACTER DEVICE>";
- case AVIO_ENTRY_NAMED_PIPE:
- return "<PIPE>";
- case AVIO_ENTRY_SYMBOLIC_LINK:
- return "<LINK>";
- case AVIO_ENTRY_SOCKET:
- return "<SOCKET>";
- case AVIO_ENTRY_SERVER:
- return "<SERVER>";
- case AVIO_ENTRY_SHARE:
- return "<SHARE>";
- case AVIO_ENTRY_WORKGROUP:
- return "<WORKGROUP>";
- case AVIO_ENTRY_UNKNOWN:
- default:
- break;
- }
- return "<UNKNOWN>";
-}
-
-static int list_op(const char *input_dir)
-{
- AVIODirEntry *entry = NULL;
- AVIODirContext *ctx = NULL;
- int cnt, ret;
- char filemode[4], uid_and_gid[20];
-
- if ((ret = avio_open_dir(&ctx, input_dir, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open directory: %s.\n", av_err2str(ret));
- goto fail;
- }
-
- cnt = 0;
- for (;;) {
- if ((ret = avio_read_dir(ctx, &entry)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot list directory: %s.\n", av_err2str(ret));
- goto fail;
- }
- if (!entry)
- break;
- if (entry->filemode == -1) {
- snprintf(filemode, 4, "???");
- } else {
- snprintf(filemode, 4, "%3"PRIo64, entry->filemode);
- }
- snprintf(uid_and_gid, 20, "%"PRId64"(%"PRId64")", entry->user_id, entry->group_id);
- if (cnt == 0)
- av_log(NULL, AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
- "TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED",
- "ACCESSED", "STATUS_CHANGED");
- av_log(NULL, AV_LOG_INFO, "%-9s %12"PRId64" %30s %10s %s %16"PRId64" %16"PRId64" %16"PRId64"\n",
- type_string(entry->type),
- entry->size,
- entry->name,
- uid_and_gid,
- filemode,
- entry->modification_timestamp,
- entry->access_timestamp,
- entry->status_change_timestamp);
- avio_free_directory_entry(&entry);
- cnt++;
- };
-
- fail:
- avio_close_dir(&ctx);
- return ret;
-}
-
-static int del_op(const char *url)
-{
- int ret = avpriv_io_delete(url);
- if (ret < 0)
- av_log(NULL, AV_LOG_ERROR, "Cannot delete '%s': %s.\n", url, av_err2str(ret));
- return ret;
-}
-
-static int move_op(const char *src, const char *dst)
-{
- int ret = avpriv_io_move(src, dst);
- if (ret < 0)
- av_log(NULL, AV_LOG_ERROR, "Cannot move '%s' into '%s': %s.\n", src, dst, av_err2str(ret));
- return ret;
-}
-
-
-static void usage(const char *program_name)
-{
- fprintf(stderr, "usage: %s OPERATION entry1 [entry2]\n"
- "API example program to show how to manipulate resources "
- "accessed through AVIOContext.\n"
- "OPERATIONS:\n"
- "list list content of the directory\n"
- "move rename content in directory\n"
- "del delete content in directory\n",
- program_name);
-}
-
-int main(int argc, char *argv[])
-{
- const char *op = NULL;
- int ret;
-
- av_log_set_level(AV_LOG_DEBUG);
-
- if (argc < 2) {
- usage(argv[0]);
- return 1;
- }
-
- /* register codecs and formats and other lavf/lavc components*/
- av_register_all();
- avformat_network_init();
-
- op = argv[1];
- if (strcmp(op, "list") == 0) {
- if (argc < 3) {
- av_log(NULL, AV_LOG_INFO, "Missing argument for list operation.\n");
- ret = AVERROR(EINVAL);
- } else {
- ret = list_op(argv[2]);
- }
- } else if (strcmp(op, "del") == 0) {
- if (argc < 3) {
- av_log(NULL, AV_LOG_INFO, "Missing argument for del operation.\n");
- ret = AVERROR(EINVAL);
- } else {
- ret = del_op(argv[2]);
- }
- } else if (strcmp(op, "move") == 0) {
- if (argc < 4) {
- av_log(NULL, AV_LOG_INFO, "Missing argument for move operation.\n");
- ret = AVERROR(EINVAL);
- } else {
- ret = move_op(argv[2], argv[3]);
- }
- } else {
- av_log(NULL, AV_LOG_INFO, "Invalid operation %s\n", op);
- ret = AVERROR(EINVAL);
- }
-
- avformat_network_deinit();
-
- return ret < 0 ? 1 : 0;
-}
diff --git a/Music/ffmpeg/doc/examples/avio_reading.c b/Music/ffmpeg/doc/examples/avio_reading.c
deleted file mode 100644
index 02474e9..0000000
--- a/Music/ffmpeg/doc/examples/avio_reading.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2014 Stefano Sabatini
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libavformat AVIOContext API example.
- *
- * Make libavformat demuxer access media content through a custom
- * AVIOContext read callback.
- * @example avio_reading.c
- */
-
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libavformat/avio.h>
-#include <libavutil/file.h>
-
-struct buffer_data {
- uint8_t *ptr;
- size_t size; ///< size left in the buffer
-};
-
-static int read_packet(void *opaque, uint8_t *buf, int buf_size)
-{
- struct buffer_data *bd = (struct buffer_data *)opaque;
- buf_size = FFMIN(buf_size, bd->size);
-
- printf("ptr:%p size:%zu\n", bd->ptr, bd->size);
-
- /* copy internal buffer data to buf */
- memcpy(buf, bd->ptr, buf_size);
- bd->ptr += buf_size;
- bd->size -= buf_size;
-
- return buf_size;
-}
-
-int main(int argc, char *argv[])
-{
- AVFormatContext *fmt_ctx = NULL;
- AVIOContext *avio_ctx = NULL;
- uint8_t *buffer = NULL, *avio_ctx_buffer = NULL;
- size_t buffer_size, avio_ctx_buffer_size = 4096;
- char *input_filename = NULL;
- int ret = 0;
- struct buffer_data bd = { 0 };
-
- if (argc != 2) {
- fprintf(stderr, "usage: %s input_file\n"
- "API example program to show how to read from a custom buffer "
- "accessed through AVIOContext.\n", argv[0]);
- return 1;
- }
- input_filename = argv[1];
-
- /* register codecs and formats and other lavf/lavc components*/
- av_register_all();
-
- /* slurp file content into buffer */
- ret = av_file_map(input_filename, &buffer, &buffer_size, 0, NULL);
- if (ret < 0)
- goto end;
-
- /* fill opaque structure used by the AVIOContext read callback */
- bd.ptr = buffer;
- bd.size = buffer_size;
-
- if (!(fmt_ctx = avformat_alloc_context())) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- avio_ctx_buffer = av_malloc(avio_ctx_buffer_size);
- if (!avio_ctx_buffer) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
- avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size,
- 0, &bd, &read_packet, NULL, NULL);
- if (!avio_ctx) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
- fmt_ctx->pb = avio_ctx;
-
- ret = avformat_open_input(&fmt_ctx, NULL, NULL, NULL);
- if (ret < 0) {
- fprintf(stderr, "Could not open input\n");
- goto end;
- }
-
- ret = avformat_find_stream_info(fmt_ctx, NULL);
- if (ret < 0) {
- fprintf(stderr, "Could not find stream information\n");
- goto end;
- }
-
- av_dump_format(fmt_ctx, 0, input_filename, 0);
-
-end:
- avformat_close_input(&fmt_ctx);
- /* note: the internal buffer could have changed, and be != avio_ctx_buffer */
- if (avio_ctx) {
- av_freep(&avio_ctx->buffer);
- av_freep(&avio_ctx);
- }
- av_file_unmap(buffer, buffer_size);
-
- if (ret < 0) {
- fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
- return 1;
- }
-
- return 0;
-}
diff --git a/Music/ffmpeg/doc/examples/decoding_encoding.c b/Music/ffmpeg/doc/examples/decoding_encoding.c
deleted file mode 100644
index 43a64c2..0000000
--- a/Music/ffmpeg/doc/examples/decoding_encoding.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- * Copyright (c) 2001 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libavcodec API use example.
- *
- * @example decoding_encoding.c
- * Note that libavcodec only handles codecs (MPEG, MPEG-4, etc...),
- * not file formats (AVI, VOB, MP4, MOV, MKV, MXF, FLV, MPEG-TS, MPEG-PS, etc...).
- * See library 'libavformat' for the format handling
- */
-
-#include <math.h>
-
-#include <libavutil/opt.h>
-#include <libavcodec/avcodec.h>
-#include <libavutil/channel_layout.h>
-#include <libavutil/common.h>
-#include <libavutil/imgutils.h>
-#include <libavutil/mathematics.h>
-#include <libavutil/samplefmt.h>
-
-#define INBUF_SIZE 4096
-#define AUDIO_INBUF_SIZE 20480
-#define AUDIO_REFILL_THRESH 4096
-
-/* check that a given sample format is supported by the encoder */
-static int check_sample_fmt(AVCodec *codec, enum AVSampleFormat sample_fmt)
-{
- const enum AVSampleFormat *p = codec->sample_fmts;
-
- while (*p != AV_SAMPLE_FMT_NONE) {
- if (*p == sample_fmt)
- return 1;
- p++;
- }
- return 0;
-}
-
-/* just pick the highest supported samplerate */
-static int select_sample_rate(AVCodec *codec)
-{
- const int *p;
- int best_samplerate = 0;
-
- if (!codec->supported_samplerates)
- return 44100;
-
- p = codec->supported_samplerates;
- while (*p) {
- best_samplerate = FFMAX(*p, best_samplerate);
- p++;
- }
- return best_samplerate;
-}
-
-/* select layout with the highest channel count */
-static int select_channel_layout(AVCodec *codec)
-{
- const uint64_t *p;
- uint64_t best_ch_layout = 0;
- int best_nb_channels = 0;
-
- if (!codec->channel_layouts)
- return AV_CH_LAYOUT_STEREO;
-
- p = codec->channel_layouts;
- while (*p) {
- int nb_channels = av_get_channel_layout_nb_channels(*p);
-
- if (nb_channels > best_nb_channels) {
- best_ch_layout = *p;
- best_nb_channels = nb_channels;
- }
- p++;
- }
- return best_ch_layout;
-}
-
-/*
- * Audio encoding example
- */
-static void audio_encode_example(const char *filename)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- AVFrame *frame;
- AVPacket pkt;
- int i, j, k, ret, got_output;
- int buffer_size;
- FILE *f;
- uint16_t *samples;
- float t, tincr;
-
- printf("Encode audio file %s\n", filename);
-
- /* find the MP2 encoder */
- codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate audio codec context\n");
- exit(1);
- }
-
- /* put sample parameters */
- c->bit_rate = 64000;
-
- /* check that the encoder supports s16 pcm input */
- c->sample_fmt = AV_SAMPLE_FMT_S16;
- if (!check_sample_fmt(codec, c->sample_fmt)) {
- fprintf(stderr, "Encoder does not support sample format %s",
- av_get_sample_fmt_name(c->sample_fmt));
- exit(1);
- }
-
- /* select other audio parameters supported by the encoder */
- c->sample_rate = select_sample_rate(codec);
- c->channel_layout = select_channel_layout(codec);
- c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "wb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
-
- /* frame containing input raw audio */
- frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Could not allocate audio frame\n");
- exit(1);
- }
-
- frame->nb_samples = c->frame_size;
- frame->format = c->sample_fmt;
- frame->channel_layout = c->channel_layout;
-
- /* the codec gives us the frame size, in samples,
- * we calculate the size of the samples buffer in bytes */
- buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size,
- c->sample_fmt, 0);
- if (buffer_size < 0) {
- fprintf(stderr, "Could not get sample buffer size\n");
- exit(1);
- }
- samples = av_malloc(buffer_size);
- if (!samples) {
- fprintf(stderr, "Could not allocate %d bytes for samples buffer\n",
- buffer_size);
- exit(1);
- }
- /* setup the data pointers in the AVFrame */
- ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt,
- (const uint8_t*)samples, buffer_size, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not setup audio frame\n");
- exit(1);
- }
-
- /* encode a single tone sound */
- t = 0;
- tincr = 2 * M_PI * 440.0 / c->sample_rate;
- for (i = 0; i < 200; i++) {
- av_init_packet(&pkt);
- pkt.data = NULL; // packet data will be allocated by the encoder
- pkt.size = 0;
-
- for (j = 0; j < c->frame_size; j++) {
- samples[2*j] = (int)(sin(t) * 10000);
-
- for (k = 1; k < c->channels; k++)
- samples[2*j + k] = samples[2*j];
- t += tincr;
- }
- /* encode the samples */
- ret = avcodec_encode_audio2(c, &pkt, frame, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding audio frame\n");
- exit(1);
- }
- if (got_output) {
- fwrite(pkt.data, 1, pkt.size, f);
- av_packet_unref(&pkt);
- }
- }
-
- /* get the delayed frames */
- for (got_output = 1; got_output; i++) {
- ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding frame\n");
- exit(1);
- }
-
- if (got_output) {
- fwrite(pkt.data, 1, pkt.size, f);
- av_packet_unref(&pkt);
- }
- }
- fclose(f);
-
- av_freep(&samples);
- av_frame_free(&frame);
- avcodec_close(c);
- av_free(c);
-}
-
-/*
- * Audio decoding.
- */
-static void audio_decode_example(const char *outfilename, const char *filename)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- int len;
- FILE *f, *outfile;
- uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
- AVPacket avpkt;
- AVFrame *decoded_frame = NULL;
-
- av_init_packet(&avpkt);
-
- printf("Decode audio file %s to %s\n", filename, outfilename);
-
- /* find the MPEG audio decoder */
- codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate audio codec context\n");
- exit(1);
- }
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "rb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
- outfile = fopen(outfilename, "wb");
- if (!outfile) {
- av_free(c);
- exit(1);
- }
-
- /* decode until eof */
- avpkt.data = inbuf;
- avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
-
- while (avpkt.size > 0) {
- int i, ch;
- int got_frame = 0;
-
- if (!decoded_frame) {
- if (!(decoded_frame = av_frame_alloc())) {
- fprintf(stderr, "Could not allocate audio frame\n");
- exit(1);
- }
- }
-
- len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
- if (len < 0) {
- fprintf(stderr, "Error while decoding\n");
- exit(1);
- }
- if (got_frame) {
- /* if a frame has been decoded, output it */
- int data_size = av_get_bytes_per_sample(c->sample_fmt);
- if (data_size < 0) {
- /* This should not occur, checking just for paranoia */
- fprintf(stderr, "Failed to calculate data size\n");
- exit(1);
- }
- for (i=0; i<decoded_frame->nb_samples; i++)
- for (ch=0; ch<c->channels; ch++)
- fwrite(decoded_frame->data[ch] + data_size*i, 1, data_size, outfile);
- }
- avpkt.size -= len;
- avpkt.data += len;
- avpkt.dts =
- avpkt.pts = AV_NOPTS_VALUE;
- if (avpkt.size < AUDIO_REFILL_THRESH) {
- /* Refill the input buffer, to avoid trying to decode
- * incomplete frames. Instead of this, one could also use
- * a parser, or use a proper container format through
- * libavformat. */
- memmove(inbuf, avpkt.data, avpkt.size);
- avpkt.data = inbuf;
- len = fread(avpkt.data + avpkt.size, 1,
- AUDIO_INBUF_SIZE - avpkt.size, f);
- if (len > 0)
- avpkt.size += len;
- }
- }
-
- fclose(outfile);
- fclose(f);
-
- avcodec_close(c);
- av_free(c);
- av_frame_free(&decoded_frame);
-}
-
-/*
- * Video encoding example
- */
-static void video_encode_example(const char *filename, int codec_id)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- int i, ret, x, y, got_output;
- FILE *f;
- AVFrame *frame;
- AVPacket pkt;
- uint8_t endcode[] = { 0, 0, 1, 0xb7 };
-
- printf("Encode video file %s\n", filename);
-
- /* find the video encoder */
- codec = avcodec_find_encoder(codec_id);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate video codec context\n");
- exit(1);
- }
-
- /* put sample parameters */
- c->bit_rate = 400000;
- /* resolution must be a multiple of two */
- c->width = 352;
- c->height = 288;
- /* frames per second */
- c->time_base = (AVRational){1,25};
- /* emit one intra frame every ten frames
- * check frame pict_type before passing frame
- * to encoder, if frame->pict_type is AV_PICTURE_TYPE_I
- * then gop_size is ignored and the output of encoder
- * will always be I frame irrespective to gop_size
- */
- c->gop_size = 10;
- c->max_b_frames = 1;
- c->pix_fmt = AV_PIX_FMT_YUV420P;
-
- if (codec_id == AV_CODEC_ID_H264)
- av_opt_set(c->priv_data, "preset", "slow", 0);
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "wb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
-
- frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Could not allocate video frame\n");
- exit(1);
- }
- frame->format = c->pix_fmt;
- frame->width = c->width;
- frame->height = c->height;
-
- /* the image can be allocated by any means and av_image_alloc() is
- * just the most convenient way if av_malloc() is to be used */
- ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height,
- c->pix_fmt, 32);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate raw picture buffer\n");
- exit(1);
- }
-
- /* encode 1 second of video */
- for (i = 0; i < 25; i++) {
- av_init_packet(&pkt);
- pkt.data = NULL; // packet data will be allocated by the encoder
- pkt.size = 0;
-
- fflush(stdout);
- /* prepare a dummy image */
- /* Y */
- for (y = 0; y < c->height; y++) {
- for (x = 0; x < c->width; x++) {
- frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
- }
- }
-
- /* Cb and Cr */
- for (y = 0; y < c->height/2; y++) {
- for (x = 0; x < c->width/2; x++) {
- frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
- frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5;
- }
- }
-
- frame->pts = i;
-
- /* encode the image */
- ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding frame\n");
- exit(1);
- }
-
- if (got_output) {
- printf("Write frame %3d (size=%5d)\n", i, pkt.size);
- fwrite(pkt.data, 1, pkt.size, f);
- av_packet_unref(&pkt);
- }
- }
-
- /* get the delayed frames */
- for (got_output = 1; got_output; i++) {
- fflush(stdout);
-
- ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
- if (ret < 0) {
- fprintf(stderr, "Error encoding frame\n");
- exit(1);
- }
-
- if (got_output) {
- printf("Write frame %3d (size=%5d)\n", i, pkt.size);
- fwrite(pkt.data, 1, pkt.size, f);
- av_packet_unref(&pkt);
- }
- }
-
- /* add sequence end code to have a real MPEG file */
- fwrite(endcode, 1, sizeof(endcode), f);
- fclose(f);
-
- avcodec_close(c);
- av_free(c);
- av_freep(&frame->data[0]);
- av_frame_free(&frame);
- printf("\n");
-}
-
-/*
- * Video decoding example
- */
-
-static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
- char *filename)
-{
- FILE *f;
- int i;
-
- f = fopen(filename,"w");
- fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255);
- for (i = 0; i < ysize; i++)
- fwrite(buf + i * wrap, 1, xsize, f);
- fclose(f);
-}
-
-static int decode_write_frame(const char *outfilename, AVCodecContext *avctx,
- AVFrame *frame, int *frame_count, AVPacket *pkt, int last)
-{
- int len, got_frame;
- char buf[1024];
-
- len = avcodec_decode_video2(avctx, frame, &got_frame, pkt);
- if (len < 0) {
- fprintf(stderr, "Error while decoding frame %d\n", *frame_count);
- return len;
- }
- if (got_frame) {
- printf("Saving %sframe %3d\n", last ? "last " : "", *frame_count);
- fflush(stdout);
-
- /* the picture is allocated by the decoder, no need to free it */
- snprintf(buf, sizeof(buf), outfilename, *frame_count);
- pgm_save(frame->data[0], frame->linesize[0],
- frame->width, frame->height, buf);
- (*frame_count)++;
- }
- if (pkt->data) {
- pkt->size -= len;
- pkt->data += len;
- }
- return 0;
-}
-
-static void video_decode_example(const char *outfilename, const char *filename)
-{
- AVCodec *codec;
- AVCodecContext *c= NULL;
- int frame_count;
- FILE *f;
- AVFrame *frame;
- uint8_t inbuf[INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
- AVPacket avpkt;
-
- av_init_packet(&avpkt);
-
- /* set end of buffer to 0 (this ensures that no overreading happens for damaged MPEG streams) */
- memset(inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
-
- printf("Decode video file %s to %s\n", filename, outfilename);
-
- /* find the MPEG-1 video decoder */
- codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO);
- if (!codec) {
- fprintf(stderr, "Codec not found\n");
- exit(1);
- }
-
- c = avcodec_alloc_context3(codec);
- if (!c) {
- fprintf(stderr, "Could not allocate video codec context\n");
- exit(1);
- }
-
- if (codec->capabilities & AV_CODEC_CAP_TRUNCATED)
- c->flags |= AV_CODEC_FLAG_TRUNCATED; // we do not send complete frames
-
- /* For some codecs, such as msmpeg4 and mpeg4, width and height
- MUST be initialized there because this information is not
- available in the bitstream. */
-
- /* open it */
- if (avcodec_open2(c, codec, NULL) < 0) {
- fprintf(stderr, "Could not open codec\n");
- exit(1);
- }
-
- f = fopen(filename, "rb");
- if (!f) {
- fprintf(stderr, "Could not open %s\n", filename);
- exit(1);
- }
-
- frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Could not allocate video frame\n");
- exit(1);
- }
-
- frame_count = 0;
- for (;;) {
- avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
- if (avpkt.size == 0)
- break;
-
- /* NOTE1: some codecs are stream based (mpegvideo, mpegaudio)
- and this is the only method to use them because you cannot
- know the compressed data size before analysing it.
-
- BUT some other codecs (msmpeg4, mpeg4) are inherently frame
- based, so you must call them with all the data for one
- frame exactly. You must also initialize 'width' and
- 'height' before initializing them. */
-
- /* NOTE2: some codecs allow the raw parameters (frame size,
- sample rate) to be changed at any frame. We handle this, so
- you should also take care of it */
-
- /* here, we use a stream based decoder (mpeg1video), so we
- feed decoder and see if it could decode a frame */
- avpkt.data = inbuf;
- while (avpkt.size > 0)
- if (decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 0) < 0)
- exit(1);
- }
-
- /* Some codecs, such as MPEG, transmit the I- and P-frame with a
- latency of one frame. You must do the following to have a
- chance to get the last frame of the video. */
- avpkt.data = NULL;
- avpkt.size = 0;
- decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1);
-
- fclose(f);
-
- avcodec_close(c);
- av_free(c);
- av_frame_free(&frame);
- printf("\n");
-}
-
-int main(int argc, char **argv)
-{
- const char *output_type;
-
- /* register all the codecs */
- avcodec_register_all();
-
- if (argc < 2) {
- printf("usage: %s output_type\n"
- "API example program to decode/encode a media stream with libavcodec.\n"
- "This program generates a synthetic stream and encodes it to a file\n"
- "named test.h264, test.mp2 or test.mpg depending on output_type.\n"
- "The encoded stream is then decoded and written to a raw data output.\n"
- "output_type must be chosen between 'h264', 'mp2', 'mpg'.\n",
- argv[0]);
- return 1;
- }
- output_type = argv[1];
-
- if (!strcmp(output_type, "h264")) {
- video_encode_example("test.h264", AV_CODEC_ID_H264);
- } else if (!strcmp(output_type, "mp2")) {
- audio_encode_example("test.mp2");
- audio_decode_example("test.pcm", "test.mp2");
- } else if (!strcmp(output_type, "mpg")) {
- video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
- video_decode_example("test%02d.pgm", "test.mpg");
- } else {
- fprintf(stderr, "Invalid output type '%s', choose between 'h264', 'mp2', or 'mpg'\n",
- output_type);
- return 1;
- }
-
- return 0;
-}
diff --git a/Music/ffmpeg/doc/examples/demuxing_decoding.c b/Music/ffmpeg/doc/examples/demuxing_decoding.c
deleted file mode 100644
index 49fb6af..0000000
--- a/Music/ffmpeg/doc/examples/demuxing_decoding.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright (c) 2012 Stefano Sabatini
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * Demuxing and decoding example.
- *
- * Show how to use the libavformat and libavcodec API to demux and
- * decode audio and video data.
- * @example demuxing_decoding.c
- */
-
-#include <libavutil/imgutils.h>
-#include <libavutil/samplefmt.h>
-#include <libavutil/timestamp.h>
-#include <libavformat/avformat.h>
-
-static AVFormatContext *fmt_ctx = NULL;
-static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx;
-static int width, height;
-static enum AVPixelFormat pix_fmt;
-static AVStream *video_stream = NULL, *audio_stream = NULL;
-static const char *src_filename = NULL;
-static const char *video_dst_filename = NULL;
-static const char *audio_dst_filename = NULL;
-static FILE *video_dst_file = NULL;
-static FILE *audio_dst_file = NULL;
-
-static uint8_t *video_dst_data[4] = {NULL};
-static int video_dst_linesize[4];
-static int video_dst_bufsize;
-
-static int video_stream_idx = -1, audio_stream_idx = -1;
-static AVFrame *frame = NULL;
-static AVPacket pkt;
-static int video_frame_count = 0;
-static int audio_frame_count = 0;
-
-/* Enable or disable frame reference counting. You are not supposed to support
- * both paths in your application but pick the one most appropriate to your
- * needs. Look for the use of refcount in this example to see what are the
- * differences of API usage between them. */
-static int refcount = 0;
-
-static int decode_packet(int *got_frame, int cached)
-{
- int ret = 0;
- int decoded = pkt.size;
-
- *got_frame = 0;
-
- if (pkt.stream_index == video_stream_idx) {
- /* decode video frame */
- ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
- if (ret < 0) {
- fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
- return ret;
- }
-
- if (*got_frame) {
-
- if (frame->width != width || frame->height != height ||
- frame->format != pix_fmt) {
- /* To handle this change, one could call av_image_alloc again and
- * decode the following frames into another rawvideo file. */
- fprintf(stderr, "Error: Width, height and pixel format have to be "
- "constant in a rawvideo file, but the width, height or "
- "pixel format of the input video changed:\n"
- "old: width = %d, height = %d, format = %s\n"
- "new: width = %d, height = %d, format = %s\n",
- width, height, av_get_pix_fmt_name(pix_fmt),
- frame->width, frame->height,
- av_get_pix_fmt_name(frame->format));
- return -1;
- }
-
- printf("video_frame%s n:%d coded_n:%d pts:%s\n",
- cached ? "(cached)" : "",
- video_frame_count++, frame->coded_picture_number,
- av_ts2timestr(frame->pts, &video_dec_ctx->time_base));
-
- /* copy decoded frame to destination buffer:
- * this is required since rawvideo expects non aligned data */
- av_image_copy(video_dst_data, video_dst_linesize,
- (const uint8_t **)(frame->data), frame->linesize,
- pix_fmt, width, height);
-
- /* write to rawvideo file */
- fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
- }
- } else if (pkt.stream_index == audio_stream_idx) {
- /* decode audio frame */
- ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt);
- if (ret < 0) {
- fprintf(stderr, "Error decoding audio frame (%s)\n", av_err2str(ret));
- return ret;
- }
- /* Some audio decoders decode only part of the packet, and have to be
- * called again with the remainder of the packet data.
- * Sample: fate-suite/lossless-audio/luckynight-partial.shn
- * Also, some decoders might over-read the packet. */
- decoded = FFMIN(ret, pkt.size);
-
- if (*got_frame) {
- size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(frame->format);
- printf("audio_frame%s n:%d nb_samples:%d pts:%s\n",
- cached ? "(cached)" : "",
- audio_frame_count++, frame->nb_samples,
- av_ts2timestr(frame->pts, &audio_dec_ctx->time_base));
-
- /* Write the raw audio data samples of the first plane. This works
- * fine for packed formats (e.g. AV_SAMPLE_FMT_S16). However,
- * most audio decoders output planar audio, which uses a separate
- * plane of audio samples for each channel (e.g. AV_SAMPLE_FMT_S16P).
- * In other words, this code will write only the first audio channel
- * in these cases.
- * You should use libswresample or libavfilter to convert the frame
- * to packed data. */
- fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file);
- }
- }
-
- /* If we use frame reference counting, we own the data and need
- * to de-reference it when we don't use it anymore */
- if (*got_frame && refcount)
- av_frame_unref(frame);
-
- return decoded;
-}
-
-static int open_codec_context(int *stream_idx,
- AVCodecContext **dec_ctx, AVFormatContext *fmt_ctx, enum AVMediaType type)
-{
- int ret, stream_index;
- AVStream *st;
- AVCodec *dec = NULL;
- AVDictionary *opts = NULL;
-
- ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not find %s stream in input file '%s'\n",
- av_get_media_type_string(type), src_filename);
- return ret;
- } else {
- stream_index = ret;
- st = fmt_ctx->streams[stream_index];
-
- /* find decoder for the stream */
- dec = avcodec_find_decoder(st->codecpar->codec_id);
- if (!dec) {
- fprintf(stderr, "Failed to find %s codec\n",
- av_get_media_type_string(type));
- return AVERROR(EINVAL);
- }
-
- /* Allocate a codec context for the decoder */
- *dec_ctx = avcodec_alloc_context3(dec);
- if (!*dec_ctx) {
- fprintf(stderr, "Failed to allocate the %s codec context\n",
- av_get_media_type_string(type));
- return AVERROR(ENOMEM);
- }
-
- /* Copy codec parameters from input stream to output codec context */
- if ((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) {
- fprintf(stderr, "Failed to copy %s codec parameters to decoder context\n",
- av_get_media_type_string(type));
- return ret;
- }
-
- /* Init the decoders, with or without reference counting */
- av_dict_set(&opts, "refcounted_frames", refcount ? "1" : "0", 0);
- if ((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) {
- fprintf(stderr, "Failed to open %s codec\n",
- av_get_media_type_string(type));
- return ret;
- }
- *stream_idx = stream_index;
- }
-
- return 0;
-}
-
-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;
-}
-
-int main (int argc, char **argv)
-{
- int ret = 0, got_frame;
-
- if (argc != 4 && argc != 5) {
- fprintf(stderr, "usage: %s [-refcount] input_file video_output_file audio_output_file\n"
- "API example program to show how to read frames from an input file.\n"
- "This program reads frames from a file, decodes them, and writes decoded\n"
- "video frames to a rawvideo file named video_output_file, and decoded\n"
- "audio frames to a rawaudio file named audio_output_file.\n\n"
- "If the -refcount option is specified, the program use the\n"
- "reference counting frame system which allows keeping a copy of\n"
- "the data for longer than one decode call.\n"
- "\n", argv[0]);
- exit(1);
- }
- if (argc == 5 && !strcmp(argv[1], "-refcount")) {
- refcount = 1;
- argv++;
- }
- src_filename = argv[1];
- video_dst_filename = argv[2];
- audio_dst_filename = argv[3];
-
- /* register all formats and codecs */
- av_register_all();
-
- /* open input file, and allocate format context */
- if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
- fprintf(stderr, "Could not open source file %s\n", src_filename);
- exit(1);
- }
-
- /* retrieve stream information */
- if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
- fprintf(stderr, "Could not find stream information\n");
- exit(1);
- }
-
- if (open_codec_context(&video_stream_idx, &video_dec_ctx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
- video_stream = fmt_ctx->streams[video_stream_idx];
-
- video_dst_file = fopen(video_dst_filename, "wb");
- if (!video_dst_file) {
- fprintf(stderr, "Could not open destination file %s\n", video_dst_filename);
- ret = 1;
- goto end;
- }
-
- /* allocate image where the decoded image will be put */
- width = video_dec_ctx->width;
- height = video_dec_ctx->height;
- pix_fmt = video_dec_ctx->pix_fmt;
- ret = av_image_alloc(video_dst_data, video_dst_linesize,
- width, height, pix_fmt, 1);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate raw video buffer\n");
- goto end;
- }
- video_dst_bufsize = ret;
- }
-
- if (open_codec_context(&audio_stream_idx, &audio_dec_ctx, fmt_ctx, AVMEDIA_TYPE_AUDIO) >= 0) {
- audio_stream = fmt_ctx->streams[audio_stream_idx];
- audio_dst_file = fopen(audio_dst_filename, "wb");
- if (!audio_dst_file) {
- fprintf(stderr, "Could not open destination file %s\n", audio_dst_filename);
- ret = 1;
- goto end;
- }
- }
-
- /* dump input information to stderr */
- av_dump_format(fmt_ctx, 0, src_filename, 0);
-
- if (!audio_stream && !video_stream) {
- fprintf(stderr, "Could not find audio or video stream in the input, aborting\n");
- ret = 1;
- goto end;
- }
-
- frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Could not allocate frame\n");
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- /* initialize packet, set data to NULL, let the demuxer fill it */
- av_init_packet(&pkt);
- pkt.data = NULL;
- pkt.size = 0;
-
- if (video_stream)
- printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename);
- if (audio_stream)
- printf("Demuxing audio from file '%s' into '%s'\n", src_filename, audio_dst_filename);
-
- /* read frames from the file */
- while (av_read_frame(fmt_ctx, &pkt) >= 0) {
- AVPacket orig_pkt = pkt;
- do {
- ret = decode_packet(&got_frame, 0);
- if (ret < 0)
- break;
- pkt.data += ret;
- pkt.size -= ret;
- } while (pkt.size > 0);
- av_packet_unref(&orig_pkt);
- }
-
- /* flush cached frames */
- pkt.data = NULL;
- pkt.size = 0;
- do {
- decode_packet(&got_frame, 1);
- } while (got_frame);
-
- printf("Demuxing succeeded.\n");
-
- if (video_stream) {
- printf("Play the output video file with the command:\n"
- "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
- av_get_pix_fmt_name(pix_fmt), width, height,
- video_dst_filename);
- }
-
- if (audio_stream) {
- enum AVSampleFormat sfmt = audio_dec_ctx->sample_fmt;
- int n_channels = audio_dec_ctx->channels;
- 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 = 1;
- }
-
- 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, audio_dec_ctx->sample_rate,
- audio_dst_filename);
- }
-
-end:
- avcodec_free_context(&video_dec_ctx);
- avcodec_free_context(&audio_dec_ctx);
- avformat_close_input(&fmt_ctx);
- if (video_dst_file)
- fclose(video_dst_file);
- if (audio_dst_file)
- fclose(audio_dst_file);
- av_frame_free(&frame);
- av_free(video_dst_data[0]);
-
- return ret < 0;
-}
diff --git a/Music/ffmpeg/doc/examples/extract_mvs.c b/Music/ffmpeg/doc/examples/extract_mvs.c
deleted file mode 100644
index 975189c..0000000
--- a/Music/ffmpeg/doc/examples/extract_mvs.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2012 Stefano Sabatini
- * Copyright (c) 2014 Clément Bœsch
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include <libavutil/motion_vector.h>
-#include <libavformat/avformat.h>
-
-static AVFormatContext *fmt_ctx = NULL;
-static AVCodecContext *video_dec_ctx = NULL;
-static AVStream *video_stream = NULL;
-static const char *src_filename = NULL;
-
-static int video_stream_idx = -1;
-static AVFrame *frame = NULL;
-static AVPacket pkt;
-static int video_frame_count = 0;
-
-static int decode_packet(int *got_frame, int cached)
-{
- int decoded = pkt.size;
-
- *got_frame = 0;
-
- if (pkt.stream_index == video_stream_idx) {
- int ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
- if (ret < 0) {
- fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
- return ret;
- }
-
- if (*got_frame) {
- int i;
- AVFrameSideData *sd;
-
- video_frame_count++;
- sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
- if (sd) {
- const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
- for (i = 0; i < sd->size / sizeof(*mvs); i++) {
- const AVMotionVector *mv = &mvs[i];
- printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,0x%"PRIx64"\n",
- video_frame_count, mv->source,
- mv->w, mv->h, mv->src_x, mv->src_y,
- mv->dst_x, mv->dst_y, mv->flags);
- }
- }
- }
- }
-
- return decoded;
-}
-
-static int open_codec_context(int *stream_idx,
- AVFormatContext *fmt_ctx, enum AVMediaType type)
-{
- int ret;
- AVStream *st;
- AVCodecContext *dec_ctx = NULL;
- AVCodec *dec = NULL;
- AVDictionary *opts = NULL;
-
- ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not find %s stream in input file '%s'\n",
- av_get_media_type_string(type), src_filename);
- return ret;
- } else {
- *stream_idx = ret;
- st = fmt_ctx->streams[*stream_idx];
-
- /* find decoder for the stream */
- dec_ctx = st->codec;
- dec = avcodec_find_decoder(dec_ctx->codec_id);
- if (!dec) {
- fprintf(stderr, "Failed to find %s codec\n",
- av_get_media_type_string(type));
- return AVERROR(EINVAL);
- }
-
- /* Init the video decoder */
- av_dict_set(&opts, "flags2", "+export_mvs", 0);
- if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
- fprintf(stderr, "Failed to open %s codec\n",
- av_get_media_type_string(type));
- return ret;
- }
- }
-
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- int ret = 0, got_frame;
-
- if (argc != 2) {
- fprintf(stderr, "Usage: %s <video>\n", argv[0]);
- exit(1);
- }
- src_filename = argv[1];
-
- av_register_all();
-
- if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
- fprintf(stderr, "Could not open source file %s\n", src_filename);
- exit(1);
- }
-
- if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
- fprintf(stderr, "Could not find stream information\n");
- exit(1);
- }
-
- if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
- video_stream = fmt_ctx->streams[video_stream_idx];
- video_dec_ctx = video_stream->codec;
- }
-
- av_dump_format(fmt_ctx, 0, src_filename, 0);
-
- if (!video_stream) {
- fprintf(stderr, "Could not find video stream in the input, aborting\n");
- ret = 1;
- goto end;
- }
-
- frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Could not allocate frame\n");
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
-
- /* initialize packet, set data to NULL, let the demuxer fill it */
- av_init_packet(&pkt);
- pkt.data = NULL;
- pkt.size = 0;
-
- /* read frames from the file */
- while (av_read_frame(fmt_ctx, &pkt) >= 0) {
- AVPacket orig_pkt = pkt;
- do {
- ret = decode_packet(&got_frame, 0);
- if (ret < 0)
- break;
- pkt.data += ret;
- pkt.size -= ret;
- } while (pkt.size > 0);
- av_packet_unref(&orig_pkt);
- }
-
- /* flush cached frames */
- pkt.data = NULL;
- pkt.size = 0;
- do {
- decode_packet(&got_frame, 1);
- } while (got_frame);
-
-end:
- avcodec_close(video_dec_ctx);
- avformat_close_input(&fmt_ctx);
- av_frame_free(&frame);
- return ret < 0;
-}
diff --git a/Music/ffmpeg/doc/examples/filter_audio.c b/Music/ffmpeg/doc/examples/filter_audio.c
deleted file mode 100644
index 01761dc..0000000
--- a/Music/ffmpeg/doc/examples/filter_audio.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * copyright (c) 2013 Andrew Kelley
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * libavfilter API usage example.
- *
- * @example filter_audio.c
- * This example will generate a sine wave audio,
- * pass it through a simple filter chain, and then compute the MD5 checksum of
- * the output data.
- *
- * The filter chain it uses is:
- * (input) -> abuffer -> volume -> aformat -> abuffersink -> (output)
- *
- * abuffer: This provides the endpoint where you can feed the decoded samples.
- * volume: In this example we hardcode it to 0.90.
- * aformat: This converts the samples to the samplefreq, channel layout,
- * and sample format required by the audio device.
- * abuffersink: This provides the endpoint where you can read the samples after
- * they have passed through the filter chain.
- */
-
-#include <inttypes.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "libavutil/channel_layout.h"
-#include "libavutil/md5.h"
-#include "libavutil/mem.h"
-#include "libavutil/opt.h"
-#include "libavutil/samplefmt.h"
-
-#include "libavfilter/avfilter.h"
-#include "libavfilter/buffersink.h"
-#include "libavfilter/buffersrc.h"
-
-#define INPUT_SAMPLERATE 48000
-#define INPUT_FORMAT AV_SAMPLE_FMT_FLTP
-#define INPUT_CHANNEL_LAYOUT AV_CH_LAYOUT_5POINT0
-
-#define VOLUME_VAL 0.90
-
-static int init_filter_graph(AVFilterGraph **graph, AVFilterContext **src,
- AVFilterContext **sink)
-{
- AVFilterGraph *filter_graph;
- AVFilterContext *abuffer_ctx;
- AVFilter *abuffer;
- AVFilterContext *volume_ctx;
- AVFilter *volume;
- AVFilterContext *aformat_ctx;
- AVFilter *aformat;
- AVFilterContext *abuffersink_ctx;
- AVFilter *abuffersink;
-
- AVDictionary *options_dict = NULL;
- uint8_t options_str[1024];
- uint8_t ch_layout[64];
-
- int err;
-
- /* Create a new filtergraph, which will contain all the filters. */
- filter_graph = avfilter_graph_alloc();
- if (!filter_graph) {
- fprintf(stderr, "Unable to create filter graph.\n");
- return AVERROR(ENOMEM);
- }
-
- /* Create the abuffer filter;
- * it will be used for feeding the data into the graph. */
- abuffer = avfilter_get_by_name("abuffer");
- if (!abuffer) {
- fprintf(stderr, "Could not find the abuffer filter.\n");
- return AVERROR_FILTER_NOT_FOUND;
- }
-
- abuffer_ctx = avfilter_graph_alloc_filter(filter_graph, abuffer, "src");
- if (!abuffer_ctx) {
- fprintf(stderr, "Could not allocate the abuffer instance.\n");
- return AVERROR(ENOMEM);
- }
-
- /* Set the filter options through the AVOptions API. */
- av_get_channel_layout_string(ch_layout, sizeof(ch_layout), 0, INPUT_CHANNEL_LAYOUT);
- av_opt_set (abuffer_ctx, "channel_layout", ch_layout, AV_OPT_SEARCH_CHILDREN);
- av_opt_set (abuffer_ctx, "sample_fmt", av_get_sample_fmt_name(INPUT_FORMAT), AV_OPT_SEARCH_CHILDREN);
- av_opt_set_q (abuffer_ctx, "time_base", (AVRational){ 1, INPUT_SAMPLERATE }, AV_OPT_SEARCH_CHILDREN);
- av_opt_set_int(abuffer_ctx, "sample_rate", INPUT_SAMPLERATE, AV_OPT_SEARCH_CHILDREN);
-
- /* Now initialize the filter; we pass NULL options, since we have already
- * set all the options above. */
- err = avfilter_init_str(abuffer_ctx, NULL);
- if (err < 0) {
- fprintf(stderr, "Could not initialize the abuffer filter.\n");
- return err;
- }
-
- /* Create volume filter. */
- volume = avfilter_get_by_name("volume");
- if (!volume) {
- fprintf(stderr, "Could not find the volume filter.\n");
- return AVERROR_FILTER_NOT_FOUND;
- }
-
- volume_ctx = avfilter_graph_alloc_filter(filter_graph, volume, "volume");
- if (!volume_ctx) {
- fprintf(stderr, "Could not allocate the volume instance.\n");
- return AVERROR(ENOMEM);
- }
-
- /* A different way of passing the options is as key/value pairs in a
- * dictionary. */
- av_dict_set(&options_dict, "volume", AV_STRINGIFY(VOLUME_VAL), 0);
- err = avfilter_init_dict(volume_ctx, &options_dict);
- av_dict_free(&options_dict);
- if (err < 0) {
- fprintf(stderr, "Could not initialize the volume filter.\n");
- return err;
- }
-
- /* Create the aformat filter;
- * it ensures that the output is of the format we want. */
- aformat = avfilter_get_by_name("aformat");
- if (!aformat) {
- fprintf(stderr, "Could not find the aformat filter.\n");
- return AVERROR_FILTER_NOT_FOUND;
- }
-
- aformat_ctx = avfilter_graph_alloc_filter(filter_graph, aformat, "aformat");
- if (!aformat_ctx) {
- fprintf(stderr, "Could not allocate the aformat instance.\n");
- return AVERROR(ENOMEM);
- }
-
- /* A third way of passing the options is in a string of the form
- * key1=value1:key2=value2.... */
- snprintf(options_str, sizeof(options_str),
- "sample_fmts=%s:sample_rates=%d:channel_layouts=0x%"PRIx64,
- av_get_sample_fmt_name(AV_SAMPLE_FMT_S16), 44100,
- (uint64_t)AV_CH_LAYOUT_STEREO);
- err = avfilter_init_str(aformat_ctx, options_str);
- if (err < 0) {
- av_log(NULL, AV_LOG_ERROR, "Could not initialize the aformat filter.\n");
- return err;
- }
-
- /* Finally create the abuffersink filter;
- * it will be used to get the filtered data out of the graph. */
- abuffersink = avfilter_get_by_name("abuffersink");
- if (!abuffersink) {
- fprintf(stderr, "Could not find the abuffersink filter.\n");
- return AVERROR_FILTER_NOT_FOUND;
- }
-
- abuffersink_ctx = avfilter_graph_alloc_filter(filter_graph, abuffersink, "sink");
- if (!abuffersink_ctx) {
- fprintf(stderr, "Could not allocate the abuffersink instance.\n");
- return AVERROR(ENOMEM);
- }
-
- /* This filter takes no options. */
- err = avfilter_init_str(abuffersink_ctx, NULL);
- if (err < 0) {
- fprintf(stderr, "Could not initialize the abuffersink instance.\n");
- return err;
- }
-
- /* Connect the filters;
- * in this simple case the filters just form a linear chain. */
- err = avfilter_link(abuffer_ctx, 0, volume_ctx, 0);
- if (err >= 0)
- err = avfilter_link(volume_ctx, 0, aformat_ctx, 0);
- if (err >= 0)
- err = avfilter_link(aformat_ctx, 0, abuffersink_ctx, 0);
- if (err < 0) {
- fprintf(stderr, "Error connecting filters\n");
- return err;
- }
-
- /* Configure the graph. */
- err = avfilter_graph_config(filter_graph, NULL);
- if (err < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error configuring the filter graph\n");
- return err;
- }
-
- *graph = filter_graph;
- *src = abuffer_ctx;
- *sink = abuffersink_ctx;
-
- return 0;
-}
-
-/* Do something useful with the filtered data: this simple
- * example just prints the MD5 checksum of each plane to stdout. */
-static int process_output(struct AVMD5 *md5, AVFrame *frame)
-{
- int planar = av_sample_fmt_is_planar(frame->format);
- int channels = av_get_channel_layout_nb_channels(frame->channel_layout);
- int planes = planar ? channels : 1;
- int bps = av_get_bytes_per_sample(frame->format);
- int plane_size = bps * frame->nb_samples * (planar ? 1 : channels);
- int i, j;
-
- for (i = 0; i < planes; i++) {
- uint8_t checksum[16];
-
- av_md5_init(md5);
- av_md5_sum(checksum, frame->extended_data[i], plane_size);
-
- fprintf(stdout, "plane %d: 0x", i);
- for (j = 0; j < sizeof(checksum); j++)
- fprintf(stdout, "%02X", checksum[j]);
- fprintf(stdout, "\n");
- }
- fprintf(stdout, "\n");
-
- return 0;
-}
-
-/* Construct a frame of audio data to be filtered;
- * this simple example just synthesizes a sine wave. */
-static int get_input(AVFrame *frame, int frame_num)
-{
- int err, i, j;
-
-#define FRAME_SIZE 1024
-
- /* Set up the frame properties and allocate the buffer for the data. */
- frame->sample_rate = INPUT_SAMPLERATE;
- frame->format = INPUT_FORMAT;
- frame->channel_layout = INPUT_CHANNEL_LAYOUT;
- frame->nb_samples = FRAME_SIZE;
- frame->pts = frame_num * FRAME_SIZE;
-
- err = av_frame_get_buffer(frame, 0);
- if (err < 0)
- return err;
-
- /* Fill the data for each channel. */
- for (i = 0; i < 5; i++) {
- float *data = (float*)frame->extended_data[i];
-
- for (j = 0; j < frame->nb_samples; j++)
- data[j] = sin(2 * M_PI * (frame_num + j) * (i + 1) / FRAME_SIZE);
- }
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- struct AVMD5 *md5;
- AVFilterGraph *graph;
- AVFilterContext *src, *sink;
- AVFrame *frame;
- uint8_t errstr[1024];
- float duration;
- int err, nb_frames, i;
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s <duration>\n", argv[0]);
- return 1;
- }
-
- duration = atof(argv[1]);
- nb_frames = duration * INPUT_SAMPLERATE / FRAME_SIZE;
- if (nb_frames <= 0) {
- fprintf(stderr, "Invalid duration: %s\n", argv[1]);
- return 1;
- }
-
- avfilter_register_all();
-
- /* Allocate the frame we will be using to store the data. */
- frame = av_frame_alloc();
- if (!frame) {
- fprintf(stderr, "Error allocating the frame\n");
- return 1;
- }
-
- md5 = av_md5_alloc();
- if (!md5) {
- fprintf(stderr, "Error allocating the MD5 context\n");
- return 1;
- }
-
- /* Set up the filtergraph. */
- err = init_filter_graph(&graph, &src, &sink);
- if (err < 0) {
- fprintf(stderr, "Unable to init filter graph:");
- goto fail;
- }
-
- /* the main filtering loop */
- for (i = 0; i < nb_frames; i++) {
- /* get an input frame to be filtered */
- err = get_input(frame, i);
- if (err < 0) {
- fprintf(stderr, "Error generating input frame:");
- goto fail;
- }
-
- /* Send the frame to the input of the filtergraph. */
- err = av_buffersrc_add_frame(src, frame);
- if (err < 0) {
- av_frame_unref(frame);
- fprintf(stderr, "Error submitting the frame to the filtergraph:");
- goto fail;
- }
-
- /* Get all the filtered output that is available. */
- while ((err = av_buffersink_get_frame(sink, frame)) >= 0) {
- /* now do something with our filtered frame */
- err = process_output(md5, frame);
- if (err < 0) {
- fprintf(stderr, "Error processing the filtered frame:");
- goto fail;
- }
- av_frame_unref(frame);
- }
-
- if (err == AVERROR(EAGAIN)) {
- /* Need to feed more frames in. */
- continue;
- } else if (err == AVERROR_EOF) {
- /* Nothing more to do, finish. */
- break;
- } else if (err < 0) {
- /* An error occurred. */
- fprintf(stderr, "Error filtering the data:");
- goto fail;
- }
- }
-
- avfilter_graph_free(&graph);
- av_frame_free(&frame);
- av_freep(&md5);
-
- return 0;
-
-fail:
- av_strerror(err, errstr, sizeof(errstr));
- fprintf(stderr, "%s\n", errstr);
- return 1;
-}
diff --git a/Music/ffmpeg/doc/examples/filtering_audio.c b/Music/ffmpeg/doc/examples/filtering_audio.c
deleted file mode 100644
index 6bb24a4..0000000
--- a/Music/ffmpeg/doc/examples/filtering_audio.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (c) 2010 Nicolas George
- * Copyright (c) 2011 Stefano Sabatini
- * Copyright (c) 2012 Clément Bœsch
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * API example for audio decoding and filtering
- * @example filtering_audio.c
- */
-
-#include <unistd.h>
-
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libavfilter/avfiltergraph.h>
-#include <libavfilter/buffersink.h>
-#include <libavfilter/buffersrc.h>
-#include <libavutil/opt.h>
-
-static const char *filter_descr = "aresample=8000,aformat=sample_fmts=s16:channel_layouts=mono";
-static const char *player = "ffplay -f s16le -ar 8000 -ac 1 -";
-
-static AVFormatContext *fmt_ctx;
-static AVCodecContext *dec_ctx;
-AVFilterContext *buffersink_ctx;
-AVFilterContext *buffersrc_ctx;
-AVFilterGraph *filter_graph;
-static int audio_stream_index = -1;
-
-static int open_input_file(const char *filename)
-{
- int ret;
- AVCodec *dec;
-
- if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
- return ret;
- }
-
- if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
- return ret;
- }
-
- /* select the audio stream */
- ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot find an audio stream in the input file\n");
- return ret;
- }
- audio_stream_index = ret;
- dec_ctx = fmt_ctx->streams[audio_stream_index]->codec;
- av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0);
-
- /* init the audio decoder */
- if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open audio decoder\n");
- return ret;
- }
-
- return 0;
-}
-
-static int init_filters(const char *filters_descr)
-{
- char args[512];
- int ret = 0;
- AVFilter *abuffersrc = avfilter_get_by_name("abuffer");
- AVFilter *abuffersink = avfilter_get_by_name("abuffersink");
- AVFilterInOut *outputs = avfilter_inout_alloc();
- AVFilterInOut *inputs = avfilter_inout_alloc();
- static const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, -1 };
- static const int64_t out_channel_layouts[] = { AV_CH_LAYOUT_MONO, -1 };
- static const int out_sample_rates[] = { 8000, -1 };
- const AVFilterLink *outlink;
- AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base;
-
- filter_graph = avfilter_graph_alloc();
- if (!outputs || !inputs || !filter_graph) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- /* buffer audio source: the decoded frames from the decoder will be inserted here. */
- if (!dec_ctx->channel_layout)
- dec_ctx->channel_layout = av_get_default_channel_layout(dec_ctx->channels);
- snprintf(args, sizeof(args),
- "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
- time_base.num, time_base.den, dec_ctx->sample_rate,
- av_get_sample_fmt_name(dec_ctx->sample_fmt), dec_ctx->channel_layout);
- ret = avfilter_graph_create_filter(&buffersrc_ctx, abuffersrc, "in",
- args, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
- goto end;
- }
-
- /* buffer audio sink: to terminate the filter chain. */
- ret = avfilter_graph_create_filter(&buffersink_ctx, abuffersink, "out",
- NULL, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
- goto end;
- }
-
- ret = av_opt_set_int_list(buffersink_ctx, "sample_fmts", out_sample_fmts, -1,
- AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
- goto end;
- }
-
- ret = av_opt_set_int_list(buffersink_ctx, "channel_layouts", out_channel_layouts, -1,
- AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
- goto end;
- }
-
- ret = av_opt_set_int_list(buffersink_ctx, "sample_rates", out_sample_rates, -1,
- AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
- goto end;
- }
-
- /*
- * Set the endpoints for the filter graph. The filter_graph will
- * be linked to the graph described by filters_descr.
- */
-
- /*
- * The buffer source output must be connected to the input pad of
- * the first filter described by filters_descr; since the first
- * filter input label is not specified, it is set to "in" by
- * default.
- */
- outputs->name = av_strdup("in");
- outputs->filter_ctx = buffersrc_ctx;
- outputs->pad_idx = 0;
- outputs->next = NULL;
-
- /*
- * The buffer sink input must be connected to the output pad of
- * the last filter described by filters_descr; since the last
- * filter output label is not specified, it is set to "out" by
- * default.
- */
- inputs->name = av_strdup("out");
- inputs->filter_ctx = buffersink_ctx;
- inputs->pad_idx = 0;
- inputs->next = NULL;
-
- if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
- &inputs, &outputs, NULL)) < 0)
- goto end;
-
- if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
- goto end;
-
- /* Print summary of the sink buffer
- * Note: args buffer is reused to store channel layout string */
- outlink = buffersink_ctx->inputs[0];
- av_get_channel_layout_string(args, sizeof(args), -1, outlink->channel_layout);
- av_log(NULL, AV_LOG_INFO, "Output: srate:%dHz fmt:%s chlayout:%s\n",
- (int)outlink->sample_rate,
- (char *)av_x_if_null(av_get_sample_fmt_name(outlink->format), "?"),
- args);
-
-end:
- avfilter_inout_free(&inputs);
- avfilter_inout_free(&outputs);
-
- return ret;
-}
-
-static void print_frame(const AVFrame *frame)
-{
- const int n = frame->nb_samples * av_get_channel_layout_nb_channels(av_frame_get_channel_layout(frame));
- const uint16_t *p = (uint16_t*)frame->data[0];
- const uint16_t *p_end = p + n;
-
- while (p < p_end) {
- fputc(*p & 0xff, stdout);
- fputc(*p>>8 & 0xff, stdout);
- p++;
- }
- fflush(stdout);
-}
-
-int main(int argc, char **argv)
-{
- int ret;
- AVPacket packet0, packet;
- AVFrame *frame = av_frame_alloc();
- AVFrame *filt_frame = av_frame_alloc();
- int got_frame;
-
- if (!frame || !filt_frame) {
- perror("Could not allocate frame");
- exit(1);
- }
- if (argc != 2) {
- fprintf(stderr, "Usage: %s file | %s\n", argv[0], player);
- exit(1);
- }
-
- av_register_all();
- avfilter_register_all();
-
- if ((ret = open_input_file(argv[1])) < 0)
- goto end;
- if ((ret = init_filters(filter_descr)) < 0)
- goto end;
-
- /* read all packets */
- packet0.data = NULL;
- packet.data = NULL;
- while (1) {
- if (!packet0.data) {
- if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
- break;
- packet0 = packet;
- }
-
- if (packet.stream_index == audio_stream_index) {
- got_frame = 0;
- ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, &packet);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n");
- continue;
- }
- packet.size -= ret;
- packet.data += ret;
-
- if (got_frame) {
- /* push the audio data from decoded frame into the filtergraph */
- if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, 0) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");
- break;
- }
-
- /* pull filtered audio from the filtergraph */
- while (1) {
- ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
- if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
- break;
- if (ret < 0)
- goto end;
- print_frame(filt_frame);
- av_frame_unref(filt_frame);
- }
- }
-
- if (packet.size <= 0)
- av_packet_unref(&packet0);
- } else {
- /* discard non-wanted packets */
- av_packet_unref(&packet0);
- }
- }
-end:
- avfilter_graph_free(&filter_graph);
- avcodec_close(dec_ctx);
- avformat_close_input(&fmt_ctx);
- av_frame_free(&frame);
- av_frame_free(&filt_frame);
-
- if (ret < 0 && ret != AVERROR_EOF) {
- fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
- exit(1);
- }
-
- exit(0);
-}
diff --git a/Music/ffmpeg/doc/examples/filtering_video.c b/Music/ffmpeg/doc/examples/filtering_video.c
deleted file mode 100644
index 3dabf13..0000000
--- a/Music/ffmpeg/doc/examples/filtering_video.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (c) 2010 Nicolas George
- * Copyright (c) 2011 Stefano Sabatini
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * API example for decoding and filtering
- * @example filtering_video.c
- */
-
-#define _XOPEN_SOURCE 600 /* for usleep */
-#include <unistd.h>
-
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libavfilter/avfiltergraph.h>
-#include <libavfilter/buffersink.h>
-#include <libavfilter/buffersrc.h>
-#include <libavutil/opt.h>
-
-const char *filter_descr = "scale=78:24,transpose=cclock";
-/* other way:
- scale=78:24 [scl]; [scl] transpose=cclock // assumes "[in]" and "[out]" to be input output pads respectively
- */
-
-static AVFormatContext *fmt_ctx;
-static AVCodecContext *dec_ctx;
-AVFilterContext *buffersink_ctx;
-AVFilterContext *buffersrc_ctx;
-AVFilterGraph *filter_graph;
-static int video_stream_index = -1;
-static int64_t last_pts = AV_NOPTS_VALUE;
-
-static int open_input_file(const char *filename)
-{
- int ret;
- AVCodec *dec;
-
- if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
- return ret;
- }
-
- if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
- return ret;
- }
-
- /* select the video stream */
- ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot find a video stream in the input file\n");
- return ret;
- }
- video_stream_index = ret;
- dec_ctx = fmt_ctx->streams[video_stream_index]->codec;
- av_opt_set_int(dec_ctx, "refcounted_frames", 1, 0);
-
- /* init the video decoder */
- if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open video decoder\n");
- return ret;
- }
-
- return 0;
-}
-
-static int init_filters(const char *filters_descr)
-{
- char args[512];
- int ret = 0;
- AVFilter *buffersrc = avfilter_get_by_name("buffer");
- AVFilter *buffersink = avfilter_get_by_name("buffersink");
- AVFilterInOut *outputs = avfilter_inout_alloc();
- AVFilterInOut *inputs = avfilter_inout_alloc();
- AVRational time_base = fmt_ctx->streams[video_stream_index]->time_base;
- enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE };
-
- filter_graph = avfilter_graph_alloc();
- if (!outputs || !inputs || !filter_graph) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- /* buffer video source: the decoded frames from the decoder will be inserted here. */
- snprintf(args, sizeof(args),
- "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
- dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
- time_base.num, time_base.den,
- dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
-
- ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
- args, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
- goto end;
- }
-
- /* buffer video sink: to terminate the filter chain. */
- ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
- NULL, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
- goto end;
- }
-
- ret = av_opt_set_int_list(buffersink_ctx, "pix_fmts", pix_fmts,
- AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
- goto end;
- }
-
- /*
- * Set the endpoints for the filter graph. The filter_graph will
- * be linked to the graph described by filters_descr.
- */
-
- /*
- * The buffer source output must be connected to the input pad of
- * the first filter described by filters_descr; since the first
- * filter input label is not specified, it is set to "in" by
- * default.
- */
- outputs->name = av_strdup("in");
- outputs->filter_ctx = buffersrc_ctx;
- outputs->pad_idx = 0;
- outputs->next = NULL;
-
- /*
- * The buffer sink input must be connected to the output pad of
- * the last filter described by filters_descr; since the last
- * filter output label is not specified, it is set to "out" by
- * default.
- */
- inputs->name = av_strdup("out");
- inputs->filter_ctx = buffersink_ctx;
- inputs->pad_idx = 0;
- inputs->next = NULL;
-
- if ((ret = avfilter_graph_parse_ptr(filter_graph, filters_descr,
- &inputs, &outputs, NULL)) < 0)
- goto end;
-
- if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
- goto end;
-
-end:
- avfilter_inout_free(&inputs);
- avfilter_inout_free(&outputs);
-
- return ret;
-}
-
-static void display_frame(const AVFrame *frame, AVRational time_base)
-{
- int x, y;
- uint8_t *p0, *p;
- int64_t delay;
-
- if (frame->pts != AV_NOPTS_VALUE) {
- if (last_pts != AV_NOPTS_VALUE) {
- /* sleep roughly the right amount of time;
- * usleep is in microseconds, just like AV_TIME_BASE. */
- delay = av_rescale_q(frame->pts - last_pts,
- time_base, AV_TIME_BASE_Q);
- if (delay > 0 && delay < 1000000)
- usleep(delay);
- }
- last_pts = frame->pts;
- }
-
- /* Trivial ASCII grayscale display. */
- p0 = frame->data[0];
- puts("\033c");
- for (y = 0; y < frame->height; y++) {
- p = p0;
- for (x = 0; x < frame->width; x++)
- putchar(" .-+#"[*(p++) / 52]);
- putchar('\n');
- p0 += frame->linesize[0];
- }
- fflush(stdout);
-}
-
-int main(int argc, char **argv)
-{
- int ret;
- AVPacket packet;
- AVFrame *frame = av_frame_alloc();
- AVFrame *filt_frame = av_frame_alloc();
- int got_frame;
-
- if (!frame || !filt_frame) {
- perror("Could not allocate frame");
- exit(1);
- }
- if (argc != 2) {
- fprintf(stderr, "Usage: %s file\n", argv[0]);
- exit(1);
- }
-
- av_register_all();
- avfilter_register_all();
-
- if ((ret = open_input_file(argv[1])) < 0)
- goto end;
- if ((ret = init_filters(filter_descr)) < 0)
- goto end;
-
- /* read all packets */
- while (1) {
- if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
- break;
-
- if (packet.stream_index == video_stream_index) {
- got_frame = 0;
- ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &packet);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error decoding video\n");
- break;
- }
-
- if (got_frame) {
- frame->pts = av_frame_get_best_effort_timestamp(frame);
-
- /* push the decoded frame into the filtergraph */
- if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
- break;
- }
-
- /* pull filtered frames from the filtergraph */
- while (1) {
- ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
- if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
- break;
- if (ret < 0)
- goto end;
- display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
- av_frame_unref(filt_frame);
- }
- av_frame_unref(frame);
- }
- }
- av_packet_unref(&packet);
- }
-end:
- avfilter_graph_free(&filter_graph);
- avcodec_close(dec_ctx);
- avformat_close_input(&fmt_ctx);
- av_frame_free(&frame);
- av_frame_free(&filt_frame);
-
- if (ret < 0 && ret != AVERROR_EOF) {
- fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
- exit(1);
- }
-
- exit(0);
-}
diff --git a/Music/ffmpeg/doc/examples/http_multiclient.c b/Music/ffmpeg/doc/examples/http_multiclient.c
deleted file mode 100644
index 7173c4d..0000000
--- a/Music/ffmpeg/doc/examples/http_multiclient.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2015 Stephan Holljes
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libavformat multi-client network API usage example.
- *
- * @example http_multiclient.c
- * This example will serve a file without decoding or demuxing it over http.
- * Multiple clients can connect and will receive the same file.
- */
-
-#include <libavformat/avformat.h>
-#include <libavutil/opt.h>
-#include <unistd.h>
-
-static void process_client(AVIOContext *client, const char *in_uri)
-{
- AVIOContext *input = NULL;
- uint8_t buf[1024];
- int ret, n, reply_code;
- uint8_t *resource = NULL;
- while ((ret = avio_handshake(client)) > 0) {
- av_opt_get(client, "resource", AV_OPT_SEARCH_CHILDREN, &resource);
- // check for strlen(resource) is necessary, because av_opt_get()
- // may return empty string.
- if (resource && strlen(resource))
- break;
- }
- if (ret < 0)
- goto end;
- av_log(client, AV_LOG_TRACE, "resource=%p\n", resource);
- if (resource && resource[0] == '/' && !strcmp((resource + 1), in_uri)) {
- reply_code = 200;
- } else {
- reply_code = AVERROR_HTTP_NOT_FOUND;
- }
- if ((ret = av_opt_set_int(client, "reply_code", reply_code, AV_OPT_SEARCH_CHILDREN)) < 0) {
- av_log(client, AV_LOG_ERROR, "Failed to set reply_code: %s.\n", av_err2str(ret));
- goto end;
- }
- av_log(client, AV_LOG_TRACE, "Set reply code to %d\n", reply_code);
-
- while ((ret = avio_handshake(client)) > 0);
-
- if (ret < 0)
- goto end;
-
- fprintf(stderr, "Handshake performed.\n");
- if (reply_code != 200)
- goto end;
- fprintf(stderr, "Opening input file.\n");
- if ((ret = avio_open2(&input, in_uri, AVIO_FLAG_READ, NULL, NULL)) < 0) {
- av_log(input, AV_LOG_ERROR, "Failed to open input: %s: %s.\n", in_uri,
- av_err2str(ret));
- goto end;
- }
- for(;;) {
- n = avio_read(input, buf, sizeof(buf));
- if (n < 0) {
- if (n == AVERROR_EOF)
- break;
- av_log(input, AV_LOG_ERROR, "Error reading from input: %s.\n",
- av_err2str(n));
- break;
- }
- avio_write(client, buf, n);
- avio_flush(client);
- }
-end:
- fprintf(stderr, "Flushing client\n");
- avio_flush(client);
- fprintf(stderr, "Closing client\n");
- avio_close(client);
- fprintf(stderr, "Closing input\n");
- avio_close(input);
-}
-
-int main(int argc, char **argv)
-{
- AVDictionary *options = NULL;
- AVIOContext *client = NULL, *server = NULL;
- const char *in_uri, *out_uri;
- int ret, pid;
- av_log_set_level(AV_LOG_TRACE);
- if (argc < 3) {
- printf("usage: %s input http://hostname[:port]\n"
- "API example program to serve http to multiple clients.\n"
- "\n", argv[0]);
- return 1;
- }
-
- in_uri = argv[1];
- out_uri = argv[2];
-
- av_register_all();
- avformat_network_init();
-
- if ((ret = av_dict_set(&options, "listen", "2", 0)) < 0) {
- fprintf(stderr, "Failed to set listen mode for server: %s\n", av_err2str(ret));
- return ret;
- }
- if ((ret = avio_open2(&server, out_uri, AVIO_FLAG_WRITE, NULL, &options)) < 0) {
- fprintf(stderr, "Failed to open server: %s\n", av_err2str(ret));
- return ret;
- }
- fprintf(stderr, "Entering main loop.\n");
- for(;;) {
- if ((ret = avio_accept(server, &client)) < 0)
- goto end;
- fprintf(stderr, "Accepted client, forking process.\n");
- // XXX: Since we don't reap our children and don't ignore signals
- // this produces zombie processes.
- pid = fork();
- if (pid < 0) {
- perror("Fork failed");
- ret = AVERROR(errno);
- goto end;
- }
- if (pid == 0) {
- fprintf(stderr, "In child.\n");
- process_client(client, in_uri);
- avio_close(server);
- exit(0);
- }
- if (pid > 0)
- avio_close(client);
- }
-end:
- avio_close(server);
- if (ret < 0 && ret != AVERROR_EOF) {
- fprintf(stderr, "Some errors occurred: %s\n", av_err2str(ret));
- return 1;
- }
- return 0;
-}
diff --git a/Music/ffmpeg/doc/examples/metadata.c b/Music/ffmpeg/doc/examples/metadata.c
deleted file mode 100644
index f73c267..0000000
--- a/Music/ffmpeg/doc/examples/metadata.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2011 Reinhard Tartler
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * Shows how the metadata API can be used in application programs.
- * @example metadata.c
- */
-
-#include <stdio.h>
-
-#include <libavformat/avformat.h>
-#include <libavutil/dict.h>
-
-int main (int argc, char **argv)
-{
- AVFormatContext *fmt_ctx = NULL;
- AVDictionaryEntry *tag = NULL;
- int ret;
-
- if (argc != 2) {
- printf("usage: %s <input_file>\n"
- "example program to demonstrate the use of the libavformat metadata API.\n"
- "\n", argv[0]);
- return 1;
- }
-
- av_register_all();
- if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
- return ret;
-
- while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
- printf("%s=%s\n", tag->key, tag->value);
-
- avformat_close_input(&fmt_ctx);
- return 0;
-}
diff --git a/Music/ffmpeg/doc/examples/muxing.c b/Music/ffmpeg/doc/examples/muxing.c
deleted file mode 100644
index f1f5bb8..0000000
--- a/Music/ffmpeg/doc/examples/muxing.c
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * Copyright (c) 2003 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libavformat API example.
- *
- * Output a media file in any supported libavformat format. The default
- * codecs are used.
- * @example muxing.c
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-
-#include <libavutil/avassert.h>
-#include <libavutil/channel_layout.h>
-#include <libavutil/opt.h>
-#include <libavutil/mathematics.h>
-#include <libavutil/timestamp.h>
-#include <libavformat/avformat.h>
-#include <libswscale/swscale.h>
-#include <libswresample/swresample.h>
-
-#define STREAM_DURATION 10.0
-#define STREAM_FRAME_RATE 25 /* 25 images/s */
-#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */
-
-#define SCALE_FLAGS SWS_BICUBIC
-
-// a wrapper around a single output AVStream
-typedef struct OutputStream {
- AVStream *st;
- AVCodecContext *enc;
-
- /* pts of the next frame that will be generated */
- int64_t next_pts;
- int samples_count;
-
- AVFrame *frame;
- AVFrame *tmp_frame;
-
- float t, tincr, tincr2;
-
- struct SwsContext *sws_ctx;
- struct SwrContext *swr_ctx;
-} OutputStream;
-
-static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
-{
- AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base;
-
- printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
- av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
- av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
- av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
- pkt->stream_index);
-}
-
-static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
-{
- /* rescale output packet timestamp values from codec to stream timebase */
- av_packet_rescale_ts(pkt, *time_base, st->time_base);
- pkt->stream_index = st->index;
-
- /* Write the compressed frame to the media file. */
- log_packet(fmt_ctx, pkt);
- return av_interleaved_write_frame(fmt_ctx, pkt);
-}
-
-/* Add an output stream. */
-static void add_stream(OutputStream *ost, AVFormatContext *oc,
- AVCodec **codec,
- enum AVCodecID codec_id)
-{
- AVCodecContext *c;
- int i;
-
- /* find the encoder */
- *codec = avcodec_find_encoder(codec_id);
- if (!(*codec)) {
- fprintf(stderr, "Could not find encoder for '%s'\n",
- avcodec_get_name(codec_id));
- exit(1);
- }
-
- ost->st = avformat_new_stream(oc, NULL);
- if (!ost->st) {
- fprintf(stderr, "Could not allocate stream\n");
- exit(1);
- }
- ost->st->id = oc->nb_streams-1;
- c = avcodec_alloc_context3(*codec);
- if (!c) {
- fprintf(stderr, "Could not alloc an encoding context\n");
- exit(1);
- }
- ost->enc = c;
-
- switch ((*codec)->type) {
- case AVMEDIA_TYPE_AUDIO:
- c->sample_fmt = (*codec)->sample_fmts ?
- (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
- c->bit_rate = 64000;
- c->sample_rate = 44100;
- if ((*codec)->supported_samplerates) {
- c->sample_rate = (*codec)->supported_samplerates[0];
- for (i = 0; (*codec)->supported_samplerates[i]; i++) {
- if ((*codec)->supported_samplerates[i] == 44100)
- c->sample_rate = 44100;
- }
- }
- c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
- c->channel_layout = AV_CH_LAYOUT_STEREO;
- if ((*codec)->channel_layouts) {
- c->channel_layout = (*codec)->channel_layouts[0];
- for (i = 0; (*codec)->channel_layouts[i]; i++) {
- if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
- c->channel_layout = AV_CH_LAYOUT_STEREO;
- }
- }
- c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
- ost->st->time_base = (AVRational){ 1, c->sample_rate };
- break;
-
- case AVMEDIA_TYPE_VIDEO:
- c->codec_id = codec_id;
-
- c->bit_rate = 400000;
- /* Resolution must be a multiple of two. */
- c->width = 352;
- c->height = 288;
- /* timebase: This is the fundamental unit of time (in seconds) in terms
- * of which frame timestamps are represented. For fixed-fps content,
- * timebase should be 1/framerate and timestamp increments should be
- * identical to 1. */
- ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE };
- c->time_base = ost->st->time_base;
-
- c->gop_size = 12; /* emit one intra frame every twelve frames at most */
- c->pix_fmt = STREAM_PIX_FMT;
- if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
- /* just for testing, we also add B-frames */
- c->max_b_frames = 2;
- }
- if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
- /* Needed to avoid using macroblocks in which some coeffs overflow.
- * This does not happen with normal video, it just happens here as
- * the motion of the chroma plane does not match the luma plane. */
- c->mb_decision = 2;
- }
- break;
-
- default:
- break;
- }
-
- /* Some formats want stream headers to be separate. */
- if (oc->oformat->flags & AVFMT_GLOBALHEADER)
- c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
-}
-
-/**************************************************************/
-/* audio output */
-
-static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt,
- uint64_t channel_layout,
- int sample_rate, int nb_samples)
-{
- AVFrame *frame = av_frame_alloc();
- int ret;
-
- if (!frame) {
- fprintf(stderr, "Error allocating an audio frame\n");
- exit(1);
- }
-
- frame->format = sample_fmt;
- frame->channel_layout = channel_layout;
- frame->sample_rate = sample_rate;
- frame->nb_samples = nb_samples;
-
- if (nb_samples) {
- ret = av_frame_get_buffer(frame, 0);
- if (ret < 0) {
- fprintf(stderr, "Error allocating an audio buffer\n");
- exit(1);
- }
- }
-
- return frame;
-}
-
-static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
-{
- AVCodecContext *c;
- int nb_samples;
- int ret;
- AVDictionary *opt = NULL;
-
- c = ost->enc;
-
- /* open it */
- av_dict_copy(&opt, opt_arg, 0);
- ret = avcodec_open2(c, codec, &opt);
- av_dict_free(&opt);
- if (ret < 0) {
- fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
- exit(1);
- }
-
- /* init signal generator */
- ost->t = 0;
- ost->tincr = 2 * M_PI * 110.0 / c->sample_rate;
- /* increment frequency by 110 Hz per second */
- ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
-
- if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)
- nb_samples = 10000;
- else
- nb_samples = c->frame_size;
-
- ost->frame = alloc_audio_frame(c->sample_fmt, c->channel_layout,
- c->sample_rate, nb_samples);
- ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
- c->sample_rate, nb_samples);
-
- /* copy the stream parameters to the muxer */
- ret = avcodec_parameters_from_context(ost->st->codecpar, c);
- if (ret < 0) {
- fprintf(stderr, "Could not copy the stream parameters\n");
- exit(1);
- }
-
- /* create resampler context */
- ost->swr_ctx = swr_alloc();
- if (!ost->swr_ctx) {
- fprintf(stderr, "Could not allocate resampler context\n");
- exit(1);
- }
-
- /* set options */
- av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0);
- av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0);
- av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
- av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0);
- av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0);
- av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
-
- /* initialize the resampling context */
- if ((ret = swr_init(ost->swr_ctx)) < 0) {
- fprintf(stderr, "Failed to initialize the resampling context\n");
- exit(1);
- }
-}
-
-/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
- * 'nb_channels' channels. */
-static AVFrame *get_audio_frame(OutputStream *ost)
-{
- AVFrame *frame = ost->tmp_frame;
- int j, i, v;
- int16_t *q = (int16_t*)frame->data[0];
-
- /* check if we want to generate more frames */
- if (av_compare_ts(ost->next_pts, ost->enc->time_base,
- STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
- return NULL;
-
- for (j = 0; j <frame->nb_samples; j++) {
- v = (int)(sin(ost->t) * 10000);
- for (i = 0; i < ost->enc->channels; i++)
- *q++ = v;
- ost->t += ost->tincr;
- ost->tincr += ost->tincr2;
- }
-
- frame->pts = ost->next_pts;
- ost->next_pts += frame->nb_samples;
-
- return frame;
-}
-
-/*
- * encode one audio frame and send it to the muxer
- * return 1 when encoding is finished, 0 otherwise
- */
-static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
-{
- AVCodecContext *c;
- AVPacket pkt = { 0 }; // data and size must be 0;
- AVFrame *frame;
- int ret;
- int got_packet;
- int dst_nb_samples;
-
- av_init_packet(&pkt);
- c = ost->enc;
-
- frame = get_audio_frame(ost);
-
- if (frame) {
- /* convert samples from native format to destination codec format, using the resampler */
- /* compute destination number of samples */
- dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples,
- c->sample_rate, c->sample_rate, AV_ROUND_UP);
- av_assert0(dst_nb_samples == frame->nb_samples);
-
- /* when we pass a frame to the encoder, it may keep a reference to it
- * internally;
- * make sure we do not overwrite it here
- */
- ret = av_frame_make_writable(ost->frame);
- if (ret < 0)
- exit(1);
-
- /* convert to destination format */
- ret = swr_convert(ost->swr_ctx,
- ost->frame->data, dst_nb_samples,
- (const uint8_t **)frame->data, frame->nb_samples);
- if (ret < 0) {
- fprintf(stderr, "Error while converting\n");
- exit(1);
- }
- frame = ost->frame;
-
- frame->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base);
- ost->samples_count += dst_nb_samples;
- }
-
- ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
- if (ret < 0) {
- fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
- exit(1);
- }
-
- if (got_packet) {
- ret = write_frame(oc, &c->time_base, ost->st, &pkt);
- if (ret < 0) {
- fprintf(stderr, "Error while writing audio frame: %s\n",
- av_err2str(ret));
- exit(1);
- }
- }
-
- return (frame || got_packet) ? 0 : 1;
-}
-
-/**************************************************************/
-/* video output */
-
-static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
-{
- AVFrame *picture;
- int ret;
-
- picture = av_frame_alloc();
- if (!picture)
- return NULL;
-
- picture->format = pix_fmt;
- picture->width = width;
- picture->height = height;
-
- /* allocate the buffers for the frame data */
- ret = av_frame_get_buffer(picture, 32);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate frame data.\n");
- exit(1);
- }
-
- return picture;
-}
-
-static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
-{
- int ret;
- AVCodecContext *c = ost->enc;
- AVDictionary *opt = NULL;
-
- av_dict_copy(&opt, opt_arg, 0);
-
- /* open the codec */
- ret = avcodec_open2(c, codec, &opt);
- av_dict_free(&opt);
- if (ret < 0) {
- fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
- exit(1);
- }
-
- /* allocate and init a re-usable frame */
- ost->frame = alloc_picture(c->pix_fmt, c->width, c->height);
- if (!ost->frame) {
- fprintf(stderr, "Could not allocate video frame\n");
- exit(1);
- }
-
- /* If the output format is not YUV420P, then a temporary YUV420P
- * picture is needed too. It is then converted to the required
- * output format. */
- ost->tmp_frame = NULL;
- if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
- ost->tmp_frame = alloc_picture(AV_PIX_FMT_YUV420P, c->width, c->height);
- if (!ost->tmp_frame) {
- fprintf(stderr, "Could not allocate temporary picture\n");
- exit(1);
- }
- }
-
- /* copy the stream parameters to the muxer */
- ret = avcodec_parameters_from_context(ost->st->codecpar, c);
- if (ret < 0) {
- fprintf(stderr, "Could not copy the stream parameters\n");
- exit(1);
- }
-}
-
-/* Prepare a dummy image. */
-static void fill_yuv_image(AVFrame *pict, int frame_index,
- int width, int height)
-{
- int x, y, i, ret;
-
- /* when we pass a frame to the encoder, it may keep a reference to it
- * internally;
- * make sure we do not overwrite it here
- */
- ret = av_frame_make_writable(pict);
- if (ret < 0)
- exit(1);
-
- i = frame_index;
-
- /* Y */
- for (y = 0; y < height; y++)
- for (x = 0; x < width; x++)
- pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3;
-
- /* Cb and Cr */
- for (y = 0; y < height / 2; y++) {
- for (x = 0; x < width / 2; x++) {
- pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2;
- pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5;
- }
- }
-}
-
-static AVFrame *get_video_frame(OutputStream *ost)
-{
- AVCodecContext *c = ost->enc;
-
- /* check if we want to generate more frames */
- if (av_compare_ts(ost->next_pts, c->time_base,
- STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
- return NULL;
-
- if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
- /* as we only generate a YUV420P picture, we must convert it
- * to the codec pixel format if needed */
- if (!ost->sws_ctx) {
- ost->sws_ctx = sws_getContext(c->width, c->height,
- AV_PIX_FMT_YUV420P,
- c->width, c->height,
- c->pix_fmt,
- SCALE_FLAGS, NULL, NULL, NULL);
- if (!ost->sws_ctx) {
- fprintf(stderr,
- "Could not initialize the conversion context\n");
- exit(1);
- }
- }
- fill_yuv_image(ost->tmp_frame, ost->next_pts, c->width, c->height);
- sws_scale(ost->sws_ctx,
- (const uint8_t * const *)ost->tmp_frame->data, ost->tmp_frame->linesize,
- 0, c->height, ost->frame->data, ost->frame->linesize);
- } else {
- fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height);
- }
-
- ost->frame->pts = ost->next_pts++;
-
- return ost->frame;
-}
-
-/*
- * encode one video frame and send it to the muxer
- * return 1 when encoding is finished, 0 otherwise
- */
-static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
-{
- int ret;
- AVCodecContext *c;
- AVFrame *frame;
- int got_packet = 0;
- AVPacket pkt = { 0 };
-
- c = ost->enc;
-
- frame = get_video_frame(ost);
-
- av_init_packet(&pkt);
-
- /* encode the image */
- ret = avcodec_encode_video2(c, &pkt, frame, &got_packet);
- if (ret < 0) {
- fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
- exit(1);
- }
-
- if (got_packet) {
- ret = write_frame(oc, &c->time_base, ost->st, &pkt);
- } else {
- ret = 0;
- }
-
- if (ret < 0) {
- fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
- exit(1);
- }
-
- return (frame || got_packet) ? 0 : 1;
-}
-
-static void close_stream(AVFormatContext *oc, OutputStream *ost)
-{
- avcodec_free_context(&ost->enc);
- av_frame_free(&ost->frame);
- av_frame_free(&ost->tmp_frame);
- sws_freeContext(ost->sws_ctx);
- swr_free(&ost->swr_ctx);
-}
-
-/**************************************************************/
-/* media file output */
-
-int main(int argc, char **argv)
-{
- OutputStream video_st = { 0 }, audio_st = { 0 };
- const char *filename;
- AVOutputFormat *fmt;
- AVFormatContext *oc;
- AVCodec *audio_codec, *video_codec;
- int ret;
- int have_video = 0, have_audio = 0;
- int encode_video = 0, encode_audio = 0;
- AVDictionary *opt = NULL;
- int i;
-
- /* Initialize libavcodec, and register all codecs and formats. */
- av_register_all();
-
- if (argc < 2) {
- printf("usage: %s output_file\n"
- "API example program to output a media file with libavformat.\n"
- "This program generates a synthetic audio and video stream, encodes and\n"
- "muxes them into a file named output_file.\n"
- "The output format is automatically guessed according to the file extension.\n"
- "Raw images can also be output by using '%%d' in the filename.\n"
- "\n", argv[0]);
- return 1;
- }
-
- filename = argv[1];
- for (i = 2; i+1 < argc; i+=2) {
- if (!strcmp(argv[i], "-flags") || !strcmp(argv[i], "-fflags"))
- av_dict_set(&opt, argv[i]+1, argv[i+1], 0);
- }
-
- /* allocate the output media context */
- avformat_alloc_output_context2(&oc, NULL, NULL, filename);
- if (!oc) {
- printf("Could not deduce output format from file extension: using MPEG.\n");
- avformat_alloc_output_context2(&oc, NULL, "mpeg", filename);
- }
- if (!oc)
- return 1;
-
- fmt = oc->oformat;
-
- /* Add the audio and video streams using the default format codecs
- * and initialize the codecs. */
- if (fmt->video_codec != AV_CODEC_ID_NONE) {
- add_stream(&video_st, oc, &video_codec, fmt->video_codec);
- have_video = 1;
- encode_video = 1;
- }
- if (fmt->audio_codec != AV_CODEC_ID_NONE) {
- add_stream(&audio_st, oc, &audio_codec, fmt->audio_codec);
- have_audio = 1;
- encode_audio = 1;
- }
-
- /* Now that all the parameters are set, we can open the audio and
- * video codecs and allocate the necessary encode buffers. */
- if (have_video)
- open_video(oc, video_codec, &video_st, opt);
-
- if (have_audio)
- open_audio(oc, audio_codec, &audio_st, opt);
-
- av_dump_format(oc, 0, filename, 1);
-
- /* open the output file, if needed */
- if (!(fmt->flags & AVFMT_NOFILE)) {
- ret = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE);
- if (ret < 0) {
- fprintf(stderr, "Could not open '%s': %s\n", filename,
- av_err2str(ret));
- return 1;
- }
- }
-
- /* Write the stream header, if any. */
- ret = avformat_write_header(oc, &opt);
- if (ret < 0) {
- fprintf(stderr, "Error occurred when opening output file: %s\n",
- av_err2str(ret));
- return 1;
- }
-
- while (encode_video || encode_audio) {
- /* select the stream to encode */
- if (encode_video &&
- (!encode_audio || av_compare_ts(video_st.next_pts, video_st.enc->time_base,
- audio_st.next_pts, audio_st.enc->time_base) <= 0)) {
- encode_video = !write_video_frame(oc, &video_st);
- } else {
- encode_audio = !write_audio_frame(oc, &audio_st);
- }
- }
-
- /* Write the trailer, if any. The trailer must be written before you
- * close the CodecContexts open when you wrote the header; otherwise
- * av_write_trailer() may try to use memory that was freed on
- * av_codec_close(). */
- av_write_trailer(oc);
-
- /* Close each codec. */
- if (have_video)
- close_stream(oc, &video_st);
- if (have_audio)
- close_stream(oc, &audio_st);
-
- if (!(fmt->flags & AVFMT_NOFILE))
- /* Close the output file. */
- avio_closep(&oc->pb);
-
- /* free the stream */
- avformat_free_context(oc);
-
- return 0;
-}
diff --git a/Music/ffmpeg/doc/examples/qsvdec.c b/Music/ffmpeg/doc/examples/qsvdec.c
deleted file mode 100644
index aaecd81..0000000
--- a/Music/ffmpeg/doc/examples/qsvdec.c
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * Copyright (c) 2015 Anton Khirnov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * Intel QSV-accelerated H.264 decoding example.
- *
- * @example qsvdec.c
- * This example shows how to do QSV-accelerated H.264 decoding with output
- * frames in the VA-API video surfaces.
- */
-
-#include "config.h"
-
-#include <stdio.h>
-
-#include <mfx/mfxvideo.h>
-
-#include <va/va.h>
-#include <va/va_x11.h>
-#include <X11/Xlib.h>
-
-#include "libavformat/avformat.h"
-#include "libavformat/avio.h"
-
-#include "libavcodec/avcodec.h"
-#include "libavcodec/qsv.h"
-
-#include "libavutil/error.h"
-#include "libavutil/mem.h"
-
-typedef struct DecodeContext {
- mfxSession mfx_session;
- VADisplay va_dpy;
-
- VASurfaceID *surfaces;
- mfxMemId *surface_ids;
- int *surface_used;
- int nb_surfaces;
-
- mfxFrameInfo frame_info;
-} DecodeContext;
-
-static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
- mfxFrameAllocResponse *resp)
-{
- DecodeContext *decode = pthis;
- int err, i;
-
- if (decode->surfaces) {
- fprintf(stderr, "Multiple allocation requests.\n");
- return MFX_ERR_MEMORY_ALLOC;
- }
- if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET)) {
- fprintf(stderr, "Unsupported surface type: %d\n", req->Type);
- return MFX_ERR_UNSUPPORTED;
- }
- if (req->Info.BitDepthLuma != 8 || req->Info.BitDepthChroma != 8 ||
- req->Info.Shift || req->Info.FourCC != MFX_FOURCC_NV12 ||
- req->Info.ChromaFormat != MFX_CHROMAFORMAT_YUV420) {
- fprintf(stderr, "Unsupported surface properties.\n");
- return MFX_ERR_UNSUPPORTED;
- }
-
- decode->surfaces = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surfaces));
- decode->surface_ids = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surface_ids));
- decode->surface_used = av_mallocz_array(req->NumFrameSuggested, sizeof(*decode->surface_used));
- if (!decode->surfaces || !decode->surface_ids || !decode->surface_used)
- goto fail;
-
- err = vaCreateSurfaces(decode->va_dpy, VA_RT_FORMAT_YUV420,
- req->Info.Width, req->Info.Height,
- decode->surfaces, req->NumFrameSuggested,
- NULL, 0);
- if (err != VA_STATUS_SUCCESS) {
- fprintf(stderr, "Error allocating VA surfaces\n");
- goto fail;
- }
- decode->nb_surfaces = req->NumFrameSuggested;
-
- for (i = 0; i < decode->nb_surfaces; i++)
- decode->surface_ids[i] = &decode->surfaces[i];
-
- resp->mids = decode->surface_ids;
- resp->NumFrameActual = decode->nb_surfaces;
-
- decode->frame_info = req->Info;
-
- return MFX_ERR_NONE;
-fail:
- av_freep(&decode->surfaces);
- av_freep(&decode->surface_ids);
- av_freep(&decode->surface_used);
-
- return MFX_ERR_MEMORY_ALLOC;
-}
-
-static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp)
-{
- return MFX_ERR_NONE;
-}
-
-static mfxStatus frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
-{
- return MFX_ERR_UNSUPPORTED;
-}
-
-static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
-{
- return MFX_ERR_UNSUPPORTED;
-}
-
-static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
-{
- *hdl = mid;
- return MFX_ERR_NONE;
-}
-
-static void free_surfaces(DecodeContext *decode)
-{
- if (decode->surfaces)
- vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces);
- av_freep(&decode->surfaces);
- av_freep(&decode->surface_ids);
- av_freep(&decode->surface_used);
- decode->nb_surfaces = 0;
-}
-
-static void free_buffer(void *opaque, uint8_t *data)
-{
- int *used = opaque;
- *used = 0;
- av_freep(&data);
-}
-
-static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
-{
- DecodeContext *decode = avctx->opaque;
-
- mfxFrameSurface1 *surf;
- AVBufferRef *surf_buf;
- int idx;
-
- for (idx = 0; idx < decode->nb_surfaces; idx++) {
- if (!decode->surface_used[idx])
- break;
- }
- if (idx == decode->nb_surfaces) {
- fprintf(stderr, "No free surfaces\n");
- return AVERROR(ENOMEM);
- }
-
- surf = av_mallocz(sizeof(*surf));
- if (!surf)
- return AVERROR(ENOMEM);
- surf_buf = av_buffer_create((uint8_t*)surf, sizeof(*surf), free_buffer,
- &decode->surface_used[idx], AV_BUFFER_FLAG_READONLY);
- if (!surf_buf) {
- av_freep(&surf);
- return AVERROR(ENOMEM);
- }
-
- surf->Info = decode->frame_info;
- surf->Data.MemId = &decode->surfaces[idx];
-
- frame->buf[0] = surf_buf;
- frame->data[3] = (uint8_t*)surf;
-
- decode->surface_used[idx] = 1;
-
- return 0;
-}
-
-static int get_format(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts)
-{
- while (*pix_fmts != AV_PIX_FMT_NONE) {
- if (*pix_fmts == AV_PIX_FMT_QSV) {
- if (!avctx->hwaccel_context) {
- DecodeContext *decode = avctx->opaque;
- AVQSVContext *qsv = av_qsv_alloc_context();
- if (!qsv)
- return AV_PIX_FMT_NONE;
-
- qsv->session = decode->mfx_session;
- qsv->iopattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY;
-
- avctx->hwaccel_context = qsv;
- }
-
- return AV_PIX_FMT_QSV;
- }
-
- pix_fmts++;
- }
-
- fprintf(stderr, "The QSV pixel format not offered in get_format()\n");
-
- return AV_PIX_FMT_NONE;
-}
-
-static int decode_packet(DecodeContext *decode, AVCodecContext *decoder_ctx,
- AVFrame *frame, AVPacket *pkt,
- AVIOContext *output_ctx)
-{
- int ret = 0;
- int got_frame = 1;
-
- while (pkt->size > 0 || (!pkt->data && got_frame)) {
- ret = avcodec_decode_video2(decoder_ctx, frame, &got_frame, pkt);
- if (ret < 0) {
- fprintf(stderr, "Error during decoding\n");
- return ret;
- }
-
- pkt->data += ret;
- pkt->size -= ret;
-
- /* A real program would do something useful with the decoded frame here.
- * We just retrieve the raw data and write it to a file, which is rather
- * useless but pedagogic. */
- if (got_frame) {
- mfxFrameSurface1 *surf = (mfxFrameSurface1*)frame->data[3];
- VASurfaceID surface = *(VASurfaceID*)surf->Data.MemId;
-
- VAImageFormat img_fmt = {
- .fourcc = VA_FOURCC_NV12,
- .byte_order = VA_LSB_FIRST,
- .bits_per_pixel = 8,
- .depth = 8,
- };
-
- VAImage img;
-
- VAStatus err;
- uint8_t *data;
- int i, j;
-
- img.buf = VA_INVALID_ID;
- img.image_id = VA_INVALID_ID;
-
- err = vaCreateImage(decode->va_dpy, &img_fmt,
- frame->width, frame->height, &img);
- if (err != VA_STATUS_SUCCESS) {
- fprintf(stderr, "Error creating an image: %s\n",
- vaErrorStr(err));
- ret = AVERROR_UNKNOWN;
- goto fail;
- }
-
- err = vaGetImage(decode->va_dpy, surface, 0, 0,
- frame->width, frame->height,
- img.image_id);
- if (err != VA_STATUS_SUCCESS) {
- fprintf(stderr, "Error getting an image: %s\n",
- vaErrorStr(err));
- ret = AVERROR_UNKNOWN;
- goto fail;
- }
-
- err = vaMapBuffer(decode->va_dpy, img.buf, (void**)&data);
- if (err != VA_STATUS_SUCCESS) {
- fprintf(stderr, "Error mapping the image buffer: %s\n",
- vaErrorStr(err));
- ret = AVERROR_UNKNOWN;
- goto fail;
- }
-
- for (i = 0; i < img.num_planes; i++)
- for (j = 0; j < (img.height >> (i > 0)); j++)
- avio_write(output_ctx, data + img.offsets[i] + j * img.pitches[i], img.width);
-
-fail:
- if (img.buf != VA_INVALID_ID)
- vaUnmapBuffer(decode->va_dpy, img.buf);
- if (img.image_id != VA_INVALID_ID)
- vaDestroyImage(decode->va_dpy, img.image_id);
- av_frame_unref(frame);
-
- if (ret < 0)
- return ret;
- }
- }
-
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- AVFormatContext *input_ctx = NULL;
- AVStream *video_st = NULL;
- AVCodecContext *decoder_ctx = NULL;
- const AVCodec *decoder;
-
- AVPacket pkt = { 0 };
- AVFrame *frame = NULL;
-
- DecodeContext decode = { NULL };
-
- Display *dpy = NULL;
- int va_ver_major, va_ver_minor;
-
- mfxIMPL mfx_impl = MFX_IMPL_AUTO_ANY;
- mfxVersion mfx_ver = { { 1, 1 } };
-
- mfxFrameAllocator frame_allocator = {
- .pthis = &decode,
- .Alloc = frame_alloc,
- .Lock = frame_lock,
- .Unlock = frame_unlock,
- .GetHDL = frame_get_hdl,
- .Free = frame_free,
- };
-
- AVIOContext *output_ctx = NULL;
-
- int ret, i, err;
-
- av_register_all();
-
- if (argc < 3) {
- fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
- return 1;
- }
-
- /* open the input file */
- ret = avformat_open_input(&input_ctx, argv[1], NULL, NULL);
- if (ret < 0) {
- fprintf(stderr, "Cannot open input file '%s': ", argv[1]);
- goto finish;
- }
-
- /* find the first H.264 video stream */
- for (i = 0; i < input_ctx->nb_streams; i++) {
- AVStream *st = input_ctx->streams[i];
-
- if (st->codecpar->codec_id == AV_CODEC_ID_H264 && !video_st)
- video_st = st;
- else
- st->discard = AVDISCARD_ALL;
- }
- if (!video_st) {
- fprintf(stderr, "No H.264 video stream in the input file\n");
- goto finish;
- }
-
- /* initialize VA-API */
- dpy = XOpenDisplay(NULL);
- if (!dpy) {
- fprintf(stderr, "Cannot open the X display\n");
- goto finish;
- }
- decode.va_dpy = vaGetDisplay(dpy);
- if (!decode.va_dpy) {
- fprintf(stderr, "Cannot open the VA display\n");
- goto finish;
- }
-
- err = vaInitialize(decode.va_dpy, &va_ver_major, &va_ver_minor);
- if (err != VA_STATUS_SUCCESS) {
- fprintf(stderr, "Cannot initialize VA: %s\n", vaErrorStr(err));
- goto finish;
- }
- fprintf(stderr, "Initialized VA v%d.%d\n", va_ver_major, va_ver_minor);
-
- /* initialize an MFX session */
- err = MFXInit(mfx_impl, &mfx_ver, &decode.mfx_session);
- if (err != MFX_ERR_NONE) {
- fprintf(stderr, "Error initializing an MFX session\n");
- goto finish;
- }
-
- MFXVideoCORE_SetHandle(decode.mfx_session, MFX_HANDLE_VA_DISPLAY, decode.va_dpy);
- MFXVideoCORE_SetFrameAllocator(decode.mfx_session, &frame_allocator);
-
- /* initialize the decoder */
- decoder = avcodec_find_decoder_by_name("h264_qsv");
- if (!decoder) {
- fprintf(stderr, "The QSV decoder is not present in libavcodec\n");
- goto finish;
- }
-
- decoder_ctx = avcodec_alloc_context3(decoder);
- if (!decoder_ctx) {
- ret = AVERROR(ENOMEM);
- goto finish;
- }
- decoder_ctx->codec_id = AV_CODEC_ID_H264;
- if (video_st->codecpar->extradata_size) {
- decoder_ctx->extradata = av_mallocz(video_st->codecpar->extradata_size +
- AV_INPUT_BUFFER_PADDING_SIZE);
- if (!decoder_ctx->extradata) {
- ret = AVERROR(ENOMEM);
- goto finish;
- }
- memcpy(decoder_ctx->extradata, video_st->codecpar->extradata,
- video_st->codecpar->extradata_size);
- decoder_ctx->extradata_size = video_st->codecpar->extradata_size;
- }
- decoder_ctx->refcounted_frames = 1;
-
- decoder_ctx->opaque = &decode;
- decoder_ctx->get_buffer2 = get_buffer;
- decoder_ctx->get_format = get_format;
-
- ret = avcodec_open2(decoder_ctx, NULL, NULL);
- if (ret < 0) {
- fprintf(stderr, "Error opening the decoder: ");
- goto finish;
- }
-
- /* open the output stream */
- ret = avio_open(&output_ctx, argv[2], AVIO_FLAG_WRITE);
- if (ret < 0) {
- fprintf(stderr, "Error opening the output context: ");
- goto finish;
- }
-
- frame = av_frame_alloc();
- if (!frame) {
- ret = AVERROR(ENOMEM);
- goto finish;
- }
-
- /* actual decoding */
- while (ret >= 0) {
- ret = av_read_frame(input_ctx, &pkt);
- if (ret < 0)
- break;
-
- if (pkt.stream_index == video_st->index)
- ret = decode_packet(&decode, decoder_ctx, frame, &pkt, output_ctx);
-
- av_packet_unref(&pkt);
- }
-
- /* flush the decoder */
- pkt.data = NULL;
- pkt.size = 0;
- ret = decode_packet(&decode, decoder_ctx, frame, &pkt, output_ctx);
-
-finish:
- if (ret < 0) {
- char buf[1024];
- av_strerror(ret, buf, sizeof(buf));
- fprintf(stderr, "%s\n", buf);
- }
-
- avformat_close_input(&input_ctx);
-
- av_frame_free(&frame);
-
- if (decoder_ctx)
- av_freep(&decoder_ctx->hwaccel_context);
- avcodec_free_context(&decoder_ctx);
-
- free_surfaces(&decode);
-
- if (decode.mfx_session)
- MFXClose(decode.mfx_session);
- if (decode.va_dpy)
- vaTerminate(decode.va_dpy);
- if (dpy)
- XCloseDisplay(dpy);
-
- avio_close(output_ctx);
-
- return ret;
-}
diff --git a/Music/ffmpeg/doc/examples/remuxing.c b/Music/ffmpeg/doc/examples/remuxing.c
deleted file mode 100644
index 65437d9..0000000
--- a/Music/ffmpeg/doc/examples/remuxing.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2013 Stefano Sabatini
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libavformat/libavcodec demuxing and muxing API example.
- *
- * Remux streams from one container format to another.
- * @example remuxing.c
- */
-
-#include <libavutil/timestamp.h>
-#include <libavformat/avformat.h>
-
-static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt, const char *tag)
-{
- AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base;
-
- printf("%s: pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
- tag,
- av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
- av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
- av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
- pkt->stream_index);
-}
-
-int main(int argc, char **argv)
-{
- AVOutputFormat *ofmt = NULL;
- AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
- AVPacket pkt;
- const char *in_filename, *out_filename;
- int ret, i;
-
- if (argc < 3) {
- printf("usage: %s input output\n"
- "API example program to remux a media file with libavformat and libavcodec.\n"
- "The output format is guessed according to the file extension.\n"
- "\n", argv[0]);
- return 1;
- }
-
- in_filename = argv[1];
- out_filename = argv[2];
-
- av_register_all();
-
- if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
- fprintf(stderr, "Could not open input file '%s'", in_filename);
- goto end;
- }
-
- if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
- fprintf(stderr, "Failed to retrieve input stream information");
- goto end;
- }
-
- av_dump_format(ifmt_ctx, 0, in_filename, 0);
-
- avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
- if (!ofmt_ctx) {
- fprintf(stderr, "Could not create output context\n");
- ret = AVERROR_UNKNOWN;
- goto end;
- }
-
- ofmt = ofmt_ctx->oformat;
-
- for (i = 0; i < ifmt_ctx->nb_streams; i++) {
- AVStream *in_stream = ifmt_ctx->streams[i];
- AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
- if (!out_stream) {
- fprintf(stderr, "Failed allocating output stream\n");
- ret = AVERROR_UNKNOWN;
- goto end;
- }
-
- ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
- if (ret < 0) {
- fprintf(stderr, "Failed to copy context from input to output stream codec context\n");
- goto end;
- }
- out_stream->codec->codec_tag = 0;
- if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
- out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
- }
- av_dump_format(ofmt_ctx, 0, out_filename, 1);
-
- if (!(ofmt->flags & AVFMT_NOFILE)) {
- ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
- if (ret < 0) {
- fprintf(stderr, "Could not open output file '%s'", out_filename);
- goto end;
- }
- }
-
- ret = avformat_write_header(ofmt_ctx, NULL);
- if (ret < 0) {
- fprintf(stderr, "Error occurred when opening output file\n");
- goto end;
- }
-
- while (1) {
- AVStream *in_stream, *out_stream;
-
- ret = av_read_frame(ifmt_ctx, &pkt);
- if (ret < 0)
- break;
-
- in_stream = ifmt_ctx->streams[pkt.stream_index];
- out_stream = ofmt_ctx->streams[pkt.stream_index];
-
- log_packet(ifmt_ctx, &pkt, "in");
-
- /* copy packet */
- pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
- pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
- pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
- pkt.pos = -1;
- log_packet(ofmt_ctx, &pkt, "out");
-
- ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
- if (ret < 0) {
- fprintf(stderr, "Error muxing packet\n");
- break;
- }
- av_packet_unref(&pkt);
- }
-
- av_write_trailer(ofmt_ctx);
-end:
-
- avformat_close_input(&ifmt_ctx);
-
- /* close output */
- if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
- avio_closep(&ofmt_ctx->pb);
- avformat_free_context(ofmt_ctx);
-
- if (ret < 0 && ret != AVERROR_EOF) {
- fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
- return 1;
- }
-
- return 0;
-}
diff --git a/Music/ffmpeg/doc/examples/resampling_audio.c b/Music/ffmpeg/doc/examples/resampling_audio.c
deleted file mode 100644
index f35e7e1..0000000
--- a/Music/ffmpeg/doc/examples/resampling_audio.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2012 Stefano Sabatini
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @example resampling_audio.c
- * libswresample API use example.
- */
-
-#include <libavutil/opt.h>
-#include <libavutil/channel_layout.h>
-#include <libavutil/samplefmt.h>
-#include <libswresample/swresample.h>
-
-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 not supported as output format\n",
- av_get_sample_fmt_name(sample_fmt));
- return AVERROR(EINVAL);
-}
-
-/**
- * Fill dst buffer with nb_samples, generated starting from t.
- */
-static void fill_samples(double *dst, int nb_samples, int nb_channels, int sample_rate, double *t)
-{
- int i, j;
- double tincr = 1.0 / sample_rate, *dstp = dst;
- const double c = 2 * M_PI * 440.0;
-
- /* generate sin tone with 440Hz frequency and duplicated channels */
- for (i = 0; i < nb_samples; i++) {
- *dstp = sin(c * *t);
- for (j = 1; j < nb_channels; j++)
- dstp[j] = dstp[0];
- dstp += nb_channels;
- *t += tincr;
- }
-}
-
-int main(int argc, char **argv)
-{
- int64_t src_ch_layout = AV_CH_LAYOUT_STEREO, dst_ch_layout = AV_CH_LAYOUT_SURROUND;
- int src_rate = 48000, dst_rate = 44100;
- uint8_t **src_data = NULL, **dst_data = NULL;
- int src_nb_channels = 0, dst_nb_channels = 0;
- int src_linesize, dst_linesize;
- int src_nb_samples = 1024, dst_nb_samples, max_dst_nb_samples;
- enum AVSampleFormat src_sample_fmt = AV_SAMPLE_FMT_DBL, dst_sample_fmt = AV_SAMPLE_FMT_S16;
- const char *dst_filename = NULL;
- FILE *dst_file;
- int dst_bufsize;
- const char *fmt;
- struct SwrContext *swr_ctx;
- double t;
- int ret;
-
- if (argc != 2) {
- fprintf(stderr, "Usage: %s output_file\n"
- "API example program to show how to resample an audio stream with libswresample.\n"
- "This program generates a series of audio frames, resamples them to a specified "
- "output format and rate and saves them to an output file named output_file.\n",
- argv[0]);
- exit(1);
- }
- dst_filename = argv[1];
-
- dst_file = fopen(dst_filename, "wb");
- if (!dst_file) {
- fprintf(stderr, "Could not open destination file %s\n", dst_filename);
- exit(1);
- }
-
- /* create resampler context */
- swr_ctx = swr_alloc();
- if (!swr_ctx) {
- fprintf(stderr, "Could not allocate resampler context\n");
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- /* set options */
- av_opt_set_int(swr_ctx, "in_channel_layout", src_ch_layout, 0);
- av_opt_set_int(swr_ctx, "in_sample_rate", src_rate, 0);
- av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", src_sample_fmt, 0);
-
- av_opt_set_int(swr_ctx, "out_channel_layout", dst_ch_layout, 0);
- av_opt_set_int(swr_ctx, "out_sample_rate", dst_rate, 0);
- av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", dst_sample_fmt, 0);
-
- /* initialize the resampling context */
- if ((ret = swr_init(swr_ctx)) < 0) {
- fprintf(stderr, "Failed to initialize the resampling context\n");
- goto end;
- }
-
- /* allocate source and destination samples buffers */
-
- src_nb_channels = av_get_channel_layout_nb_channels(src_ch_layout);
- ret = av_samples_alloc_array_and_samples(&src_data, &src_linesize, src_nb_channels,
- src_nb_samples, src_sample_fmt, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate source samples\n");
- goto end;
- }
-
- /* compute the number of converted samples: buffering is avoided
- * ensuring that the output buffer will contain at least all the
- * converted input samples */
- max_dst_nb_samples = dst_nb_samples =
- av_rescale_rnd(src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);
-
- /* buffer is going to be directly written to a rawaudio file, no alignment */
- dst_nb_channels = av_get_channel_layout_nb_channels(dst_ch_layout);
- ret = av_samples_alloc_array_and_samples(&dst_data, &dst_linesize, dst_nb_channels,
- dst_nb_samples, dst_sample_fmt, 0);
- if (ret < 0) {
- fprintf(stderr, "Could not allocate destination samples\n");
- goto end;
- }
-
- t = 0;
- do {
- /* generate synthetic audio */
- fill_samples((double *)src_data[0], src_nb_samples, src_nb_channels, src_rate, &t);
-
- /* compute destination number of samples */
- dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) +
- src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);
- if (dst_nb_samples > max_dst_nb_samples) {
- av_freep(&dst_data[0]);
- ret = av_samples_alloc(dst_data, &dst_linesize, dst_nb_channels,
- dst_nb_samples, dst_sample_fmt, 1);
- if (ret < 0)
- break;
- max_dst_nb_samples = dst_nb_samples;
- }
-
- /* convert to destination format */
- ret = swr_convert(swr_ctx, dst_data, dst_nb_samples, (const uint8_t **)src_data, src_nb_samples);
- if (ret < 0) {
- fprintf(stderr, "Error while converting\n");
- goto end;
- }
- dst_bufsize = av_samples_get_buffer_size(&dst_linesize, dst_nb_channels,
- ret, dst_sample_fmt, 1);
- if (dst_bufsize < 0) {
- fprintf(stderr, "Could not get sample buffer size\n");
- goto end;
- }
- printf("t:%f in:%d out:%d\n", t, src_nb_samples, ret);
- fwrite(dst_data[0], 1, dst_bufsize, dst_file);
- } while (t < 10);
-
- if ((ret = get_format_from_sample_fmt(&fmt, dst_sample_fmt)) < 0)
- goto end;
- fprintf(stderr, "Resampling succeeded. Play the output file with the command:\n"
- "ffplay -f %s -channel_layout %"PRId64" -channels %d -ar %d %s\n",
- fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename);
-
-end:
- fclose(dst_file);
-
- if (src_data)
- av_freep(&src_data[0]);
- av_freep(&src_data);
-
- if (dst_data)
- av_freep(&dst_data[0]);
- av_freep(&dst_data);
-
- swr_free(&swr_ctx);
- return ret < 0;
-}
diff --git a/Music/ffmpeg/doc/examples/scaling_video.c b/Music/ffmpeg/doc/examples/scaling_video.c
deleted file mode 100644
index 587f3ab..0000000
--- a/Music/ffmpeg/doc/examples/scaling_video.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2012 Stefano Sabatini
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * libswscale API use example.
- * @example scaling_video.c
- */
-
-#include <libavutil/imgutils.h>
-#include <libavutil/parseutils.h>
-#include <libswscale/swscale.h>
-
-static void fill_yuv_image(uint8_t *data[4], int linesize[4],
- int width, int height, int frame_index)
-{
- int x, y;
-
- /* Y */
- for (y = 0; y < height; y++)
- for (x = 0; x < width; x++)
- data[0][y * linesize[0] + x] = x + y + frame_index * 3;
-
- /* Cb and Cr */
- for (y = 0; y < height / 2; y++) {
- for (x = 0; x < width / 2; x++) {
- data[1][y * linesize[1] + x] = 128 + y + frame_index * 2;
- data[2][y * linesize[2] + x] = 64 + x + frame_index * 5;
- }
- }
-}
-
-int main(int argc, char **argv)
-{
- uint8_t *src_data[4], *dst_data[4];
- int src_linesize[4], dst_linesize[4];
- int src_w = 320, src_h = 240, dst_w, dst_h;
- enum AVPixelFormat src_pix_fmt = AV_PIX_FMT_YUV420P, dst_pix_fmt = AV_PIX_FMT_RGB24;
- const char *dst_size = NULL;
- const char *dst_filename = NULL;
- FILE *dst_file;
- int dst_bufsize;
- struct SwsContext *sws_ctx;
- int i, ret;
-
- if (argc != 3) {
- fprintf(stderr, "Usage: %s output_file output_size\n"
- "API example program to show how to scale an image with libswscale.\n"
- "This program generates a series of pictures, rescales them to the given "
- "output_size and saves them to an output file named output_file\n."
- "\n", argv[0]);
- exit(1);
- }
- dst_filename = argv[1];
- dst_size = argv[2];
-
- if (av_parse_video_size(&dst_w, &dst_h, dst_size) < 0) {
- fprintf(stderr,
- "Invalid size '%s', must be in the form WxH or a valid size abbreviation\n",
- dst_size);
- exit(1);
- }
-
- dst_file = fopen(dst_filename, "wb");
- if (!dst_file) {
- fprintf(stderr, "Could not open destination file %s\n", dst_filename);
- exit(1);
- }
-
- /* create scaling context */
- sws_ctx = sws_getContext(src_w, src_h, src_pix_fmt,
- dst_w, dst_h, dst_pix_fmt,
- SWS_BILINEAR, NULL, NULL, NULL);
- if (!sws_ctx) {
- fprintf(stderr,
- "Impossible to create scale context for the conversion "
- "fmt:%s s:%dx%d -> fmt:%s s:%dx%d\n",
- av_get_pix_fmt_name(src_pix_fmt), src_w, src_h,
- av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h);
- ret = AVERROR(EINVAL);
- goto end;
- }
-
- /* allocate source and destination image buffers */
- if ((ret = av_image_alloc(src_data, src_linesize,
- src_w, src_h, src_pix_fmt, 16)) < 0) {
- fprintf(stderr, "Could not allocate source image\n");
- goto end;
- }
-
- /* buffer is going to be written to rawvideo file, no alignment */
- if ((ret = av_image_alloc(dst_data, dst_linesize,
- dst_w, dst_h, dst_pix_fmt, 1)) < 0) {
- fprintf(stderr, "Could not allocate destination image\n");
- goto end;
- }
- dst_bufsize = ret;
-
- for (i = 0; i < 100; i++) {
- /* generate synthetic video */
- fill_yuv_image(src_data, src_linesize, src_w, src_h, i);
-
- /* convert to destination format */
- sws_scale(sws_ctx, (const uint8_t * const*)src_data,
- src_linesize, 0, src_h, dst_data, dst_linesize);
-
- /* write scaled image to file */
- fwrite(dst_data[0], 1, dst_bufsize, dst_file);
- }
-
- fprintf(stderr, "Scaling succeeded. Play the output file with the command:\n"
- "ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
- av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);
-
-end:
- fclose(dst_file);
- av_freep(&src_data[0]);
- av_freep(&dst_data[0]);
- sws_freeContext(sws_ctx);
- return ret < 0;
-}
diff --git a/Music/ffmpeg/doc/examples/transcode_aac.c b/Music/ffmpeg/doc/examples/transcode_aac.c
deleted file mode 100644
index 9b3ee67..0000000
--- a/Music/ffmpeg/doc/examples/transcode_aac.c
+++ /dev/null
@@ -1,802 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * simple audio converter
- *
- * @example transcode_aac.c
- * Convert an input audio file to AAC in an MP4 container using FFmpeg.
- * @author Andreas Unterweger (dustsigns@gmail.com)
- */
-
-#include <stdio.h>
-
-#include "libavformat/avformat.h"
-#include "libavformat/avio.h"
-
-#include "libavcodec/avcodec.h"
-
-#include "libavutil/audio_fifo.h"
-#include "libavutil/avassert.h"
-#include "libavutil/avstring.h"
-#include "libavutil/frame.h"
-#include "libavutil/opt.h"
-
-#include "libswresample/swresample.h"
-
-/** The output bit rate in kbit/s */
-#define OUTPUT_BIT_RATE 96000
-/** The number of output channels */
-#define OUTPUT_CHANNELS 2
-
-/**
- * Convert an error code into a text message.
- * @param error Error code to be converted
- * @return Corresponding error text (not thread-safe)
- */
-static const char *get_error_text(const int error)
-{
- static char error_buffer[255];
- av_strerror(error, error_buffer, sizeof(error_buffer));
- return error_buffer;
-}
-
-/** Open an input file and the required decoder. */
-static int open_input_file(const char *filename,
- AVFormatContext **input_format_context,
- AVCodecContext **input_codec_context)
-{
- AVCodecContext *avctx;
- AVCodec *input_codec;
- int error;
-
- /** Open the input file to read from it. */
- if ((error = avformat_open_input(input_format_context, filename, NULL,
- NULL)) < 0) {
- fprintf(stderr, "Could not open input file '%s' (error '%s')\n",
- filename, get_error_text(error));
- *input_format_context = NULL;
- return error;
- }
-
- /** Get information on the input file (number of streams etc.). */
- if ((error = avformat_find_stream_info(*input_format_context, NULL)) < 0) {
- fprintf(stderr, "Could not open find stream info (error '%s')\n",
- get_error_text(error));
- avformat_close_input(input_format_context);
- return error;
- }
-
- /** Make sure that there is only one stream in the input file. */
- if ((*input_format_context)->nb_streams != 1) {
- fprintf(stderr, "Expected one audio input stream, but found %d\n",
- (*input_format_context)->nb_streams);
- avformat_close_input(input_format_context);
- return AVERROR_EXIT;
- }
-
- /** Find a decoder for the audio stream. */
- if (!(input_codec = avcodec_find_decoder((*input_format_context)->streams[0]->codecpar->codec_id))) {
- fprintf(stderr, "Could not find input codec\n");
- avformat_close_input(input_format_context);
- return AVERROR_EXIT;
- }
-
- /** allocate a new decoding context */
- avctx = avcodec_alloc_context3(input_codec);
- if (!avctx) {
- fprintf(stderr, "Could not allocate a decoding context\n");
- avformat_close_input(input_format_context);
- return AVERROR(ENOMEM);
- }
-
- /** initialize the stream parameters with demuxer information */
- error = avcodec_parameters_to_context(avctx, (*input_format_context)->streams[0]->codecpar);
- if (error < 0) {
- avformat_close_input(input_format_context);
- avcodec_free_context(&avctx);
- return error;
- }
-
- /** Open the decoder for the audio stream to use it later. */
- if ((error = avcodec_open2(avctx, input_codec, NULL)) < 0) {
- fprintf(stderr, "Could not open input codec (error '%s')\n",
- get_error_text(error));
- avcodec_free_context(&avctx);
- avformat_close_input(input_format_context);
- return error;
- }
-
- /** Save the decoder context for easier access later. */
- *input_codec_context = avctx;
-
- return 0;
-}
-
-/**
- * Open an output file and the required encoder.
- * Also set some basic encoder parameters.
- * Some of these parameters are based on the input file's parameters.
- */
-static int open_output_file(const char *filename,
- AVCodecContext *input_codec_context,
- AVFormatContext **output_format_context,
- AVCodecContext **output_codec_context)
-{
- AVCodecContext *avctx = NULL;
- AVIOContext *output_io_context = NULL;
- AVStream *stream = NULL;
- AVCodec *output_codec = NULL;
- int error;
-
- /** Open the output file to write to it. */
- if ((error = avio_open(&output_io_context, filename,
- AVIO_FLAG_WRITE)) < 0) {
- fprintf(stderr, "Could not open output file '%s' (error '%s')\n",
- filename, get_error_text(error));
- return error;
- }
-
- /** Create a new format context for the output container format. */
- if (!(*output_format_context = avformat_alloc_context())) {
- fprintf(stderr, "Could not allocate output format context\n");
- return AVERROR(ENOMEM);
- }
-
- /** Associate the output file (pointer) with the container format context. */
- (*output_format_context)->pb = output_io_context;
-
- /** Guess the desired container format based on the file extension. */
- if (!((*output_format_context)->oformat = av_guess_format(NULL, filename,
- NULL))) {
- fprintf(stderr, "Could not find output file format\n");
- goto cleanup;
- }
-
- av_strlcpy((*output_format_context)->filename, filename,
- sizeof((*output_format_context)->filename));
-
- /** Find the encoder to be used by its name. */
- if (!(output_codec = avcodec_find_encoder(AV_CODEC_ID_AAC))) {
- fprintf(stderr, "Could not find an AAC encoder.\n");
- goto cleanup;
- }
-
- /** Create a new audio stream in the output file container. */
- if (!(stream = avformat_new_stream(*output_format_context, NULL))) {
- fprintf(stderr, "Could not create new stream\n");
- error = AVERROR(ENOMEM);
- goto cleanup;
- }
-
- avctx = avcodec_alloc_context3(output_codec);
- if (!avctx) {
- fprintf(stderr, "Could not allocate an encoding context\n");
- error = AVERROR(ENOMEM);
- goto cleanup;
- }
-
- /**
- * Set the basic encoder parameters.
- * The input file's sample rate is used to avoid a sample rate conversion.
- */
- avctx->channels = OUTPUT_CHANNELS;
- avctx->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
- avctx->sample_rate = input_codec_context->sample_rate;
- avctx->sample_fmt = output_codec->sample_fmts[0];
- avctx->bit_rate = OUTPUT_BIT_RATE;
-
- /** Allow the use of the experimental AAC encoder */
- avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
-
- /** Set the sample rate for the container. */
- stream->time_base.den = input_codec_context->sample_rate;
- stream->time_base.num = 1;
-
- /**
- * Some container formats (like MP4) require global headers to be present
- * Mark the encoder so that it behaves accordingly.
- */
- if ((*output_format_context)->oformat->flags & AVFMT_GLOBALHEADER)
- avctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
-
- /** Open the encoder for the audio stream to use it later. */
- if ((error = avcodec_open2(avctx, output_codec, NULL)) < 0) {
- fprintf(stderr, "Could not open output codec (error '%s')\n",
- get_error_text(error));
- goto cleanup;
- }
-
- error = avcodec_parameters_from_context(stream->codecpar, avctx);
- if (error < 0) {
- fprintf(stderr, "Could not initialize stream parameters\n");
- goto cleanup;
- }
-
- /** Save the encoder context for easier access later. */
- *output_codec_context = avctx;
-
- return 0;
-
-cleanup:
- avcodec_free_context(&avctx);
- avio_closep(&(*output_format_context)->pb);
- avformat_free_context(*output_format_context);
- *output_format_context = NULL;
- return error < 0 ? error : AVERROR_EXIT;
-}
-
-/** Initialize one data packet for reading or writing. */
-static void init_packet(AVPacket *packet)
-{
- av_init_packet(packet);
- /** Set the packet data and size so that it is recognized as being empty. */
- packet->data = NULL;
- packet->size = 0;
-}
-
-/** Initialize one audio frame for reading from the input file */
-static int init_input_frame(AVFrame **frame)
-{
- if (!(*frame = av_frame_alloc())) {
- fprintf(stderr, "Could not allocate input frame\n");
- return AVERROR(ENOMEM);
- }
- return 0;
-}
-
-/**
- * Initialize the audio resampler based on the input and output codec settings.
- * If the input and output sample formats differ, a conversion is required
- * libswresample takes care of this, but requires initialization.
- */
-static int init_resampler(AVCodecContext *input_codec_context,
- AVCodecContext *output_codec_context,
- SwrContext **resample_context)
-{
- int error;
-
- /**
- * Create a resampler context for the conversion.
- * Set the conversion parameters.
- * Default channel layouts based on the number of channels
- * are assumed for simplicity (they are sometimes not detected
- * properly by the demuxer and/or decoder).
- */
- *resample_context = swr_alloc_set_opts(NULL,
- av_get_default_channel_layout(output_codec_context->channels),
- output_codec_context->sample_fmt,
- output_codec_context->sample_rate,
- av_get_default_channel_layout(input_codec_context->channels),
- input_codec_context->sample_fmt,
- input_codec_context->sample_rate,
- 0, NULL);
- if (!*resample_context) {
- fprintf(stderr, "Could not allocate resample context\n");
- return AVERROR(ENOMEM);
- }
- /**
- * Perform a sanity check so that the number of converted samples is
- * not greater than the number of samples to be converted.
- * If the sample rates differ, this case has to be handled differently
- */
- av_assert0(output_codec_context->sample_rate == input_codec_context->sample_rate);
-
- /** Open the resampler with the specified parameters. */
- if ((error = swr_init(*resample_context)) < 0) {
- fprintf(stderr, "Could not open resample context\n");
- swr_free(resample_context);
- return error;
- }
- return 0;
-}
-
-/** Initialize a FIFO buffer for the audio samples to be encoded. */
-static int init_fifo(AVAudioFifo **fifo, AVCodecContext *output_codec_context)
-{
- /** Create the FIFO buffer based on the specified output sample format. */
- if (!(*fifo = av_audio_fifo_alloc(output_codec_context->sample_fmt,
- output_codec_context->channels, 1))) {
- fprintf(stderr, "Could not allocate FIFO\n");
- return AVERROR(ENOMEM);
- }
- return 0;
-}
-
-/** Write the header of the output file container. */
-static int write_output_file_header(AVFormatContext *output_format_context)
-{
- int error;
- if ((error = avformat_write_header(output_format_context, NULL)) < 0) {
- fprintf(stderr, "Could not write output file header (error '%s')\n",
- get_error_text(error));
- return error;
- }
- return 0;
-}
-
-/** Decode one audio frame from the input file. */
-static int decode_audio_frame(AVFrame *frame,
- AVFormatContext *input_format_context,
- AVCodecContext *input_codec_context,
- int *data_present, int *finished)
-{
- /** Packet used for temporary storage. */
- AVPacket input_packet;
- int error;
- init_packet(&input_packet);
-
- /** Read one audio frame from the input file into a temporary packet. */
- if ((error = av_read_frame(input_format_context, &input_packet)) < 0) {
- /** If we are at the end of the file, flush the decoder below. */
- if (error == AVERROR_EOF)
- *finished = 1;
- else {
- fprintf(stderr, "Could not read frame (error '%s')\n",
- get_error_text(error));
- return error;
- }
- }
-
- /**
- * Decode the audio frame stored in the temporary packet.
- * The input audio stream decoder is used to do this.
- * If we are at the end of the file, pass an empty packet to the decoder
- * to flush it.
- */
- if ((error = avcodec_decode_audio4(input_codec_context, frame,
- data_present, &input_packet)) < 0) {
- fprintf(stderr, "Could not decode frame (error '%s')\n",
- get_error_text(error));
- av_packet_unref(&input_packet);
- return error;
- }
-
- /**
- * If the decoder has not been flushed completely, we are not finished,
- * so that this function has to be called again.
- */
- if (*finished && *data_present)
- *finished = 0;
- av_packet_unref(&input_packet);
- return 0;
-}
-
-/**
- * Initialize a temporary storage for the specified number of audio samples.
- * The conversion requires temporary storage due to the different format.
- * The number of audio samples to be allocated is specified in frame_size.
- */
-static int init_converted_samples(uint8_t ***converted_input_samples,
- AVCodecContext *output_codec_context,
- int frame_size)
-{
- int error;
-
- /**
- * Allocate as many pointers as there are audio channels.
- * Each pointer will later point to the audio samples of the corresponding
- * channels (although it may be NULL for interleaved formats).
- */
- if (!(*converted_input_samples = calloc(output_codec_context->channels,
- sizeof(**converted_input_samples)))) {
- fprintf(stderr, "Could not allocate converted input sample pointers\n");
- return AVERROR(ENOMEM);
- }
-
- /**
- * Allocate memory for the samples of all channels in one consecutive
- * block for convenience.
- */
- if ((error = av_samples_alloc(*converted_input_samples, NULL,
- output_codec_context->channels,
- frame_size,
- output_codec_context->sample_fmt, 0)) < 0) {
- fprintf(stderr,
- "Could not allocate converted input samples (error '%s')\n",
- get_error_text(error));
- av_freep(&(*converted_input_samples)[0]);
- free(*converted_input_samples);
- return error;
- }
- return 0;
-}
-
-/**
- * Convert the input audio samples into the output sample format.
- * The conversion happens on a per-frame basis, the size of which is specified
- * by frame_size.
- */
-static int convert_samples(const uint8_t **input_data,
- uint8_t **converted_data, const int frame_size,
- SwrContext *resample_context)
-{
- int error;
-
- /** Convert the samples using the resampler. */
- if ((error = swr_convert(resample_context,
- converted_data, frame_size,
- input_data , frame_size)) < 0) {
- fprintf(stderr, "Could not convert input samples (error '%s')\n",
- get_error_text(error));
- return error;
- }
-
- return 0;
-}
-
-/** Add converted input audio samples to the FIFO buffer for later processing. */
-static int add_samples_to_fifo(AVAudioFifo *fifo,
- uint8_t **converted_input_samples,
- const int frame_size)
-{
- int error;
-
- /**
- * Make the FIFO as large as it needs to be to hold both,
- * the old and the new samples.
- */
- if ((error = av_audio_fifo_realloc(fifo, av_audio_fifo_size(fifo) + frame_size)) < 0) {
- fprintf(stderr, "Could not reallocate FIFO\n");
- return error;
- }
-
- /** Store the new samples in the FIFO buffer. */
- if (av_audio_fifo_write(fifo, (void **)converted_input_samples,
- frame_size) < frame_size) {
- fprintf(stderr, "Could not write data to FIFO\n");
- return AVERROR_EXIT;
- }
- return 0;
-}
-
-/**
- * Read one audio frame from the input file, decodes, converts and stores
- * it in the FIFO buffer.
- */
-static int read_decode_convert_and_store(AVAudioFifo *fifo,
- AVFormatContext *input_format_context,
- AVCodecContext *input_codec_context,
- AVCodecContext *output_codec_context,
- SwrContext *resampler_context,
- int *finished)
-{
- /** Temporary storage of the input samples of the frame read from the file. */
- AVFrame *input_frame = NULL;
- /** Temporary storage for the converted input samples. */
- uint8_t **converted_input_samples = NULL;
- int data_present;
- int ret = AVERROR_EXIT;
-
- /** Initialize temporary storage for one input frame. */
- if (init_input_frame(&input_frame))
- goto cleanup;
- /** Decode one frame worth of audio samples. */
- if (decode_audio_frame(input_frame, input_format_context,
- input_codec_context, &data_present, finished))
- goto cleanup;
- /**
- * If we are at the end of the file and there are no more samples
- * in the decoder which are delayed, we are actually finished.
- * This must not be treated as an error.
- */
- if (*finished && !data_present) {
- ret = 0;
- goto cleanup;
- }
- /** If there is decoded data, convert and store it */
- if (data_present) {
- /** Initialize the temporary storage for the converted input samples. */
- if (init_converted_samples(&converted_input_samples, output_codec_context,
- input_frame->nb_samples))
- goto cleanup;
-
- /**
- * Convert the input samples to the desired output sample format.
- * This requires a temporary storage provided by converted_input_samples.
- */
- if (convert_samples((const uint8_t**)input_frame->extended_data, converted_input_samples,
- input_frame->nb_samples, resampler_context))
- goto cleanup;
-
- /** Add the converted input samples to the FIFO buffer for later processing. */
- if (add_samples_to_fifo(fifo, converted_input_samples,
- input_frame->nb_samples))
- goto cleanup;
- ret = 0;
- }
- ret = 0;
-
-cleanup:
- if (converted_input_samples) {
- av_freep(&converted_input_samples[0]);
- free(converted_input_samples);
- }
- av_frame_free(&input_frame);
-
- return ret;
-}
-
-/**
- * Initialize one input frame for writing to the output file.
- * The frame will be exactly frame_size samples large.
- */
-static int init_output_frame(AVFrame **frame,
- AVCodecContext *output_codec_context,
- int frame_size)
-{
- int error;
-
- /** Create a new frame to store the audio samples. */
- if (!(*frame = av_frame_alloc())) {
- fprintf(stderr, "Could not allocate output frame\n");
- return AVERROR_EXIT;
- }
-
- /**
- * Set the frame's parameters, especially its size and format.
- * av_frame_get_buffer needs this to allocate memory for the
- * audio samples of the frame.
- * Default channel layouts based on the number of channels
- * are assumed for simplicity.
- */
- (*frame)->nb_samples = frame_size;
- (*frame)->channel_layout = output_codec_context->channel_layout;
- (*frame)->format = output_codec_context->sample_fmt;
- (*frame)->sample_rate = output_codec_context->sample_rate;
-
- /**
- * Allocate the samples of the created frame. This call will make
- * sure that the audio frame can hold as many samples as specified.
- */
- if ((error = av_frame_get_buffer(*frame, 0)) < 0) {
- fprintf(stderr, "Could allocate output frame samples (error '%s')\n",
- get_error_text(error));
- av_frame_free(frame);
- return error;
- }
-
- return 0;
-}
-
-/** Global timestamp for the audio frames */
-static int64_t pts = 0;
-
-/** Encode one frame worth of audio to the output file. */
-static int encode_audio_frame(AVFrame *frame,
- AVFormatContext *output_format_context,
- AVCodecContext *output_codec_context,
- int *data_present)
-{
- /** Packet used for temporary storage. */
- AVPacket output_packet;
- int error;
- init_packet(&output_packet);
-
- /** Set a timestamp based on the sample rate for the container. */
- if (frame) {
- frame->pts = pts;
- pts += frame->nb_samples;
- }
-
- /**
- * Encode the audio frame and store it in the temporary packet.
- * The output audio stream encoder is used to do this.
- */
- if ((error = avcodec_encode_audio2(output_codec_context, &output_packet,
- frame, data_present)) < 0) {
- fprintf(stderr, "Could not encode frame (error '%s')\n",
- get_error_text(error));
- av_packet_unref(&output_packet);
- return error;
- }
-
- /** Write one audio frame from the temporary packet to the output file. */
- if (*data_present) {
- if ((error = av_write_frame(output_format_context, &output_packet)) < 0) {
- fprintf(stderr, "Could not write frame (error '%s')\n",
- get_error_text(error));
- av_packet_unref(&output_packet);
- return error;
- }
-
- av_packet_unref(&output_packet);
- }
-
- return 0;
-}
-
-/**
- * Load one audio frame from the FIFO buffer, encode and write it to the
- * output file.
- */
-static int load_encode_and_write(AVAudioFifo *fifo,
- AVFormatContext *output_format_context,
- AVCodecContext *output_codec_context)
-{
- /** Temporary storage of the output samples of the frame written to the file. */
- AVFrame *output_frame;
- /**
- * Use the maximum number of possible samples per frame.
- * If there is less than the maximum possible frame size in the FIFO
- * buffer use this number. Otherwise, use the maximum possible frame size
- */
- const int frame_size = FFMIN(av_audio_fifo_size(fifo),
- output_codec_context->frame_size);
- int data_written;
-
- /** Initialize temporary storage for one output frame. */
- if (init_output_frame(&output_frame, output_codec_context, frame_size))
- return AVERROR_EXIT;
-
- /**
- * Read as many samples from the FIFO buffer as required to fill the frame.
- * The samples are stored in the frame temporarily.
- */
- if (av_audio_fifo_read(fifo, (void **)output_frame->data, frame_size) < frame_size) {
- fprintf(stderr, "Could not read data from FIFO\n");
- av_frame_free(&output_frame);
- return AVERROR_EXIT;
- }
-
- /** Encode one frame worth of audio samples. */
- if (encode_audio_frame(output_frame, output_format_context,
- output_codec_context, &data_written)) {
- av_frame_free(&output_frame);
- return AVERROR_EXIT;
- }
- av_frame_free(&output_frame);
- return 0;
-}
-
-/** Write the trailer of the output file container. */
-static int write_output_file_trailer(AVFormatContext *output_format_context)
-{
- int error;
- if ((error = av_write_trailer(output_format_context)) < 0) {
- fprintf(stderr, "Could not write output file trailer (error '%s')\n",
- get_error_text(error));
- return error;
- }
- return 0;
-}
-
-/** Convert an audio file to an AAC file in an MP4 container. */
-int main(int argc, char **argv)
-{
- AVFormatContext *input_format_context = NULL, *output_format_context = NULL;
- AVCodecContext *input_codec_context = NULL, *output_codec_context = NULL;
- SwrContext *resample_context = NULL;
- AVAudioFifo *fifo = NULL;
- int ret = AVERROR_EXIT;
-
- if (argc < 3) {
- fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
- exit(1);
- }
-
- /** Register all codecs and formats so that they can be used. */
- av_register_all();
- /** Open the input file for reading. */
- if (open_input_file(argv[1], &input_format_context,
- &input_codec_context))
- goto cleanup;
- /** Open the output file for writing. */
- if (open_output_file(argv[2], input_codec_context,
- &output_format_context, &output_codec_context))
- goto cleanup;
- /** Initialize the resampler to be able to convert audio sample formats. */
- if (init_resampler(input_codec_context, output_codec_context,
- &resample_context))
- goto cleanup;
- /** Initialize the FIFO buffer to store audio samples to be encoded. */
- if (init_fifo(&fifo, output_codec_context))
- goto cleanup;
- /** Write the header of the output file container. */
- if (write_output_file_header(output_format_context))
- goto cleanup;
-
- /**
- * Loop as long as we have input samples to read or output samples
- * to write; abort as soon as we have neither.
- */
- while (1) {
- /** Use the encoder's desired frame size for processing. */
- const int output_frame_size = output_codec_context->frame_size;
- int finished = 0;
-
- /**
- * Make sure that there is one frame worth of samples in the FIFO
- * buffer so that the encoder can do its work.
- * Since the decoder's and the encoder's frame size may differ, we
- * need to FIFO buffer to store as many frames worth of input samples
- * that they make up at least one frame worth of output samples.
- */
- while (av_audio_fifo_size(fifo) < output_frame_size) {
- /**
- * Decode one frame worth of audio samples, convert it to the
- * output sample format and put it into the FIFO buffer.
- */
- if (read_decode_convert_and_store(fifo, input_format_context,
- input_codec_context,
- output_codec_context,
- resample_context, &finished))
- goto cleanup;
-
- /**
- * If we are at the end of the input file, we continue
- * encoding the remaining audio samples to the output file.
- */
- if (finished)
- break;
- }
-
- /**
- * If we have enough samples for the encoder, we encode them.
- * At the end of the file, we pass the remaining samples to
- * the encoder.
- */
- while (av_audio_fifo_size(fifo) >= output_frame_size ||
- (finished && av_audio_fifo_size(fifo) > 0))
- /**
- * Take one frame worth of audio samples from the FIFO buffer,
- * encode it and write it to the output file.
- */
- if (load_encode_and_write(fifo, output_format_context,
- output_codec_context))
- goto cleanup;
-
- /**
- * If we are at the end of the input file and have encoded
- * all remaining samples, we can exit this loop and finish.
- */
- if (finished) {
- int data_written;
- /** Flush the encoder as it may have delayed frames. */
- do {
- if (encode_audio_frame(NULL, output_format_context,
- output_codec_context, &data_written))
- goto cleanup;
- } while (data_written);
- break;
- }
- }
-
- /** Write the trailer of the output file container. */
- if (write_output_file_trailer(output_format_context))
- goto cleanup;
- ret = 0;
-
-cleanup:
- if (fifo)
- av_audio_fifo_free(fifo);
- swr_free(&resample_context);
- if (output_codec_context)
- avcodec_free_context(&output_codec_context);
- if (output_format_context) {
- avio_closep(&output_format_context->pb);
- avformat_free_context(output_format_context);
- }
- if (input_codec_context)
- avcodec_free_context(&input_codec_context);
- if (input_format_context)
- avformat_close_input(&input_format_context);
-
- return ret;
-}
diff --git a/Music/ffmpeg/doc/examples/transcoding.c b/Music/ffmpeg/doc/examples/transcoding.c
deleted file mode 100644
index 8633362..0000000
--- a/Music/ffmpeg/doc/examples/transcoding.c
+++ /dev/null
@@ -1,585 +0,0 @@
-/*
- * Copyright (c) 2010 Nicolas George
- * Copyright (c) 2011 Stefano Sabatini
- * Copyright (c) 2014 Andrey Utkin
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * @file
- * API example for demuxing, decoding, filtering, encoding and muxing
- * @example transcoding.c
- */
-
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libavfilter/avfiltergraph.h>
-#include <libavfilter/buffersink.h>
-#include <libavfilter/buffersrc.h>
-#include <libavutil/opt.h>
-#include <libavutil/pixdesc.h>
-
-static AVFormatContext *ifmt_ctx;
-static AVFormatContext *ofmt_ctx;
-typedef struct FilteringContext {
- AVFilterContext *buffersink_ctx;
- AVFilterContext *buffersrc_ctx;
- AVFilterGraph *filter_graph;
-} FilteringContext;
-static FilteringContext *filter_ctx;
-
-static int open_input_file(const char *filename)
-{
- int ret;
- unsigned int i;
-
- ifmt_ctx = NULL;
- if ((ret = avformat_open_input(&ifmt_ctx, filename, NULL, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
- return ret;
- }
-
- if ((ret = avformat_find_stream_info(ifmt_ctx, NULL)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
- return ret;
- }
-
- for (i = 0; i < ifmt_ctx->nb_streams; i++) {
- AVStream *stream;
- AVCodecContext *codec_ctx;
- stream = ifmt_ctx->streams[i];
- codec_ctx = stream->codec;
- /* Reencode video & audio and remux subtitles etc. */
- if (codec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
- || codec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
- /* Open decoder */
- ret = avcodec_open2(codec_ctx,
- avcodec_find_decoder(codec_ctx->codec_id), NULL);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Failed to open decoder for stream #%u\n", i);
- return ret;
- }
- }
- }
-
- av_dump_format(ifmt_ctx, 0, filename, 0);
- return 0;
-}
-
-static int open_output_file(const char *filename)
-{
- AVStream *out_stream;
- AVStream *in_stream;
- AVCodecContext *dec_ctx, *enc_ctx;
- AVCodec *encoder;
- int ret;
- unsigned int i;
-
- ofmt_ctx = NULL;
- avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);
- if (!ofmt_ctx) {
- av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
- return AVERROR_UNKNOWN;
- }
-
-
- for (i = 0; i < ifmt_ctx->nb_streams; i++) {
- out_stream = avformat_new_stream(ofmt_ctx, NULL);
- if (!out_stream) {
- av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
- return AVERROR_UNKNOWN;
- }
-
- in_stream = ifmt_ctx->streams[i];
- dec_ctx = in_stream->codec;
- enc_ctx = out_stream->codec;
-
- if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
- || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
- /* in this example, we choose transcoding to same codec */
- encoder = avcodec_find_encoder(dec_ctx->codec_id);
- if (!encoder) {
- av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
- return AVERROR_INVALIDDATA;
- }
-
- /* In this example, we transcode to same properties (picture size,
- * sample rate etc.). These properties can be changed for output
- * streams easily using filters */
- if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
- enc_ctx->height = dec_ctx->height;
- enc_ctx->width = dec_ctx->width;
- enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
- /* take first format from list of supported formats */
- if (encoder->pix_fmts)
- enc_ctx->pix_fmt = encoder->pix_fmts[0];
- else
- enc_ctx->pix_fmt = dec_ctx->pix_fmt;
- /* video time_base can be set to whatever is handy and supported by encoder */
- enc_ctx->time_base = dec_ctx->time_base;
- } else {
- enc_ctx->sample_rate = dec_ctx->sample_rate;
- enc_ctx->channel_layout = dec_ctx->channel_layout;
- enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
- /* take first format from list of supported formats */
- enc_ctx->sample_fmt = encoder->sample_fmts[0];
- enc_ctx->time_base = (AVRational){1, enc_ctx->sample_rate};
- }
-
- /* Third parameter can be used to pass settings to encoder */
- ret = avcodec_open2(enc_ctx, encoder, NULL);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
- return ret;
- }
- } else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
- av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
- return AVERROR_INVALIDDATA;
- } else {
- /* if this stream must be remuxed */
- ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
- ifmt_ctx->streams[i]->codec);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
- return ret;
- }
- }
-
- if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
- enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
-
- }
- av_dump_format(ofmt_ctx, 0, filename, 1);
-
- if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
- ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
- return ret;
- }
- }
-
- /* init muxer, write output file header */
- ret = avformat_write_header(ofmt_ctx, NULL);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
- return ret;
- }
-
- return 0;
-}
-
-static int init_filter(FilteringContext* fctx, AVCodecContext *dec_ctx,
- AVCodecContext *enc_ctx, const char *filter_spec)
-{
- char args[512];
- int ret = 0;
- AVFilter *buffersrc = NULL;
- AVFilter *buffersink = NULL;
- AVFilterContext *buffersrc_ctx = NULL;
- AVFilterContext *buffersink_ctx = NULL;
- AVFilterInOut *outputs = avfilter_inout_alloc();
- AVFilterInOut *inputs = avfilter_inout_alloc();
- AVFilterGraph *filter_graph = avfilter_graph_alloc();
-
- if (!outputs || !inputs || !filter_graph) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
- buffersrc = avfilter_get_by_name("buffer");
- buffersink = avfilter_get_by_name("buffersink");
- if (!buffersrc || !buffersink) {
- av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
- ret = AVERROR_UNKNOWN;
- goto end;
- }
-
- snprintf(args, sizeof(args),
- "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
- dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
- dec_ctx->time_base.num, dec_ctx->time_base.den,
- dec_ctx->sample_aspect_ratio.num,
- dec_ctx->sample_aspect_ratio.den);
-
- ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
- args, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create buffer source\n");
- goto end;
- }
-
- ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
- NULL, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create buffer sink\n");
- goto end;
- }
-
- ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
- (uint8_t*)&enc_ctx->pix_fmt, sizeof(enc_ctx->pix_fmt),
- AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output pixel format\n");
- goto end;
- }
- } else if (dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
- buffersrc = avfilter_get_by_name("abuffer");
- buffersink = avfilter_get_by_name("abuffersink");
- if (!buffersrc || !buffersink) {
- av_log(NULL, AV_LOG_ERROR, "filtering source or sink element not found\n");
- ret = AVERROR_UNKNOWN;
- goto end;
- }
-
- if (!dec_ctx->channel_layout)
- dec_ctx->channel_layout =
- av_get_default_channel_layout(dec_ctx->channels);
- snprintf(args, sizeof(args),
- "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64,
- dec_ctx->time_base.num, dec_ctx->time_base.den, dec_ctx->sample_rate,
- av_get_sample_fmt_name(dec_ctx->sample_fmt),
- dec_ctx->channel_layout);
- ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
- args, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer source\n");
- goto end;
- }
-
- ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
- NULL, NULL, filter_graph);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot create audio buffer sink\n");
- goto end;
- }
-
- ret = av_opt_set_bin(buffersink_ctx, "sample_fmts",
- (uint8_t*)&enc_ctx->sample_fmt, sizeof(enc_ctx->sample_fmt),
- AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output sample format\n");
- goto end;
- }
-
- ret = av_opt_set_bin(buffersink_ctx, "channel_layouts",
- (uint8_t*)&enc_ctx->channel_layout,
- sizeof(enc_ctx->channel_layout), AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output channel layout\n");
- goto end;
- }
-
- ret = av_opt_set_bin(buffersink_ctx, "sample_rates",
- (uint8_t*)&enc_ctx->sample_rate, sizeof(enc_ctx->sample_rate),
- AV_OPT_SEARCH_CHILDREN);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Cannot set output sample rate\n");
- goto end;
- }
- } else {
- ret = AVERROR_UNKNOWN;
- goto end;
- }
-
- /* Endpoints for the filter graph. */
- outputs->name = av_strdup("in");
- outputs->filter_ctx = buffersrc_ctx;
- outputs->pad_idx = 0;
- outputs->next = NULL;
-
- inputs->name = av_strdup("out");
- inputs->filter_ctx = buffersink_ctx;
- inputs->pad_idx = 0;
- inputs->next = NULL;
-
- if (!outputs->name || !inputs->name) {
- ret = AVERROR(ENOMEM);
- goto end;
- }
-
- if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_spec,
- &inputs, &outputs, NULL)) < 0)
- goto end;
-
- if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)
- goto end;
-
- /* Fill FilteringContext */
- fctx->buffersrc_ctx = buffersrc_ctx;
- fctx->buffersink_ctx = buffersink_ctx;
- fctx->filter_graph = filter_graph;
-
-end:
- avfilter_inout_free(&inputs);
- avfilter_inout_free(&outputs);
-
- return ret;
-}
-
-static int init_filters(void)
-{
- const char *filter_spec;
- unsigned int i;
- int ret;
- filter_ctx = av_malloc_array(ifmt_ctx->nb_streams, sizeof(*filter_ctx));
- if (!filter_ctx)
- return AVERROR(ENOMEM);
-
- for (i = 0; i < ifmt_ctx->nb_streams; i++) {
- filter_ctx[i].buffersrc_ctx = NULL;
- filter_ctx[i].buffersink_ctx = NULL;
- filter_ctx[i].filter_graph = NULL;
- if (!(ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO
- || ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO))
- continue;
-
-
- if (ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
- filter_spec = "null"; /* passthrough (dummy) filter for video */
- else
- filter_spec = "anull"; /* passthrough (dummy) filter for audio */
- ret = init_filter(&filter_ctx[i], ifmt_ctx->streams[i]->codec,
- ofmt_ctx->streams[i]->codec, filter_spec);
- if (ret)
- return ret;
- }
- return 0;
-}
-
-static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) {
- int ret;
- int got_frame_local;
- AVPacket enc_pkt;
- int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
- (ifmt_ctx->streams[stream_index]->codec->codec_type ==
- AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;
-
- if (!got_frame)
- got_frame = &got_frame_local;
-
- av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
- /* encode filtered frame */
- enc_pkt.data = NULL;
- enc_pkt.size = 0;
- av_init_packet(&enc_pkt);
- ret = enc_func(ofmt_ctx->streams[stream_index]->codec, &enc_pkt,
- filt_frame, got_frame);
- av_frame_free(&filt_frame);
- if (ret < 0)
- return ret;
- if (!(*got_frame))
- return 0;
-
- /* prepare packet for muxing */
- enc_pkt.stream_index = stream_index;
- av_packet_rescale_ts(&enc_pkt,
- ofmt_ctx->streams[stream_index]->codec->time_base,
- ofmt_ctx->streams[stream_index]->time_base);
-
- av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
- /* mux encoded frame */
- ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt);
- return ret;
-}
-
-static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
-{
- int ret;
- AVFrame *filt_frame;
-
- av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
- /* push the decoded frame into the filtergraph */
- ret = av_buffersrc_add_frame_flags(filter_ctx[stream_index].buffersrc_ctx,
- frame, 0);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
- return ret;
- }
-
- /* pull filtered frames from the filtergraph */
- while (1) {
- filt_frame = av_frame_alloc();
- if (!filt_frame) {
- ret = AVERROR(ENOMEM);
- break;
- }
- av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
- ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx,
- filt_frame);
- if (ret < 0) {
- /* if no more frames for output - returns AVERROR(EAGAIN)
- * if flushed and no more frames for output - returns AVERROR_EOF
- * rewrite retcode to 0 to show it as normal procedure completion
- */
- if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
- ret = 0;
- av_frame_free(&filt_frame);
- break;
- }
-
- filt_frame->pict_type = AV_PICTURE_TYPE_NONE;
- ret = encode_write_frame(filt_frame, stream_index, NULL);
- if (ret < 0)
- break;
- }
-
- return ret;
-}
-
-static int flush_encoder(unsigned int stream_index)
-{
- int ret;
- int got_frame;
-
- if (!(ofmt_ctx->streams[stream_index]->codec->codec->capabilities &
- AV_CODEC_CAP_DELAY))
- return 0;
-
- while (1) {
- av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
- ret = encode_write_frame(NULL, stream_index, &got_frame);
- if (ret < 0)
- break;
- if (!got_frame)
- return 0;
- }
- return ret;
-}
-
-int main(int argc, char **argv)
-{
- int ret;
- AVPacket packet = { .data = NULL, .size = 0 };
- AVFrame *frame = NULL;
- enum AVMediaType type;
- unsigned int stream_index;
- unsigned int i;
- int got_frame;
- int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);
-
- if (argc != 3) {
- av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file> <output file>\n", argv[0]);
- return 1;
- }
-
- av_register_all();
- avfilter_register_all();
-
- if ((ret = open_input_file(argv[1])) < 0)
- goto end;
- if ((ret = open_output_file(argv[2])) < 0)
- goto end;
- if ((ret = init_filters()) < 0)
- goto end;
-
- /* read all packets */
- while (1) {
- if ((ret = av_read_frame(ifmt_ctx, &packet)) < 0)
- break;
- stream_index = packet.stream_index;
- type = ifmt_ctx->streams[packet.stream_index]->codec->codec_type;
- av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
- stream_index);
-
- if (filter_ctx[stream_index].filter_graph) {
- av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n");
- frame = av_frame_alloc();
- if (!frame) {
- ret = AVERROR(ENOMEM);
- break;
- }
- av_packet_rescale_ts(&packet,
- ifmt_ctx->streams[stream_index]->time_base,
- ifmt_ctx->streams[stream_index]->codec->time_base);
- dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
- avcodec_decode_audio4;
- ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
- &got_frame, &packet);
- if (ret < 0) {
- av_frame_free(&frame);
- av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
- break;
- }
-
- if (got_frame) {
- frame->pts = av_frame_get_best_effort_timestamp(frame);
- ret = filter_encode_write_frame(frame, stream_index);
- av_frame_free(&frame);
- if (ret < 0)
- goto end;
- } else {
- av_frame_free(&frame);
- }
- } else {
- /* remux this frame without reencoding */
- av_packet_rescale_ts(&packet,
- ifmt_ctx->streams[stream_index]->time_base,
- ofmt_ctx->streams[stream_index]->time_base);
-
- ret = av_interleaved_write_frame(ofmt_ctx, &packet);
- if (ret < 0)
- goto end;
- }
- av_packet_unref(&packet);
- }
-
- /* flush filters and encoders */
- for (i = 0; i < ifmt_ctx->nb_streams; i++) {
- /* flush filter */
- if (!filter_ctx[i].filter_graph)
- continue;
- ret = filter_encode_write_frame(NULL, i);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Flushing filter failed\n");
- goto end;
- }
-
- /* flush encoder */
- ret = flush_encoder(i);
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Flushing encoder failed\n");
- goto end;
- }
- }
-
- av_write_trailer(ofmt_ctx);
-end:
- av_packet_unref(&packet);
- av_frame_free(&frame);
- for (i = 0; i < ifmt_ctx->nb_streams; i++) {
- avcodec_close(ifmt_ctx->streams[i]->codec);
- if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && ofmt_ctx->streams[i]->codec)
- avcodec_close(ofmt_ctx->streams[i]->codec);
- if (filter_ctx && filter_ctx[i].filter_graph)
- avfilter_graph_free(&filter_ctx[i].filter_graph);
- }
- av_free(filter_ctx);
- avformat_close_input(&ifmt_ctx);
- if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
- avio_closep(&ofmt_ctx->pb);
- avformat_free_context(ofmt_ctx);
-
- if (ret < 0)
- av_log(NULL, AV_LOG_ERROR, "Error occurred: %s\n", av_err2str(ret));
-
- return ret ? 1 : 0;
-}