diff options
Diffstat (limited to 'ffmpeg/doc/examples')
| -rw-r--r-- | ffmpeg/doc/examples/Makefile | 39 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/README | 23 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/decoding_encoding.c | 653 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/filtering_audio.c | 282 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/filtering_video.c | 263 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/metadata.c | 56 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/muxing.c | 571 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libavcodec.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libavdevice.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libavfilter.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libavformat.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libavutil.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libpostproc.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libswresample.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/pc-uninstalled/libswscale.pc | 12 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/resampling_audio.c | 215 | ||||
| -rw-r--r-- | ffmpeg/doc/examples/scaling_video.c | 141 |
17 files changed, 0 insertions, 2339 deletions
diff --git a/ffmpeg/doc/examples/Makefile b/ffmpeg/doc/examples/Makefile deleted file mode 100644 index f085532..0000000 --- a/ffmpeg/doc/examples/Makefile +++ /dev/null @@ -1,39 +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= decoding_encoding \ - demuxing_decoding \ - filtering_video \ - filtering_audio \ - metadata \ - muxing \ - resampling_audio \ - scaling_video \ - transcode_aac \ - -OBJS=$(addsuffix .o,$(EXAMPLES)) - -# the following examples make explicit use of the math library -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/ffmpeg/doc/examples/README b/ffmpeg/doc/examples/README deleted file mode 100644 index c1ce619..0000000 --- a/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/ffmpeg/doc/examples/decoding_encoding.c b/ffmpeg/doc/examples/decoding_encoding.c deleted file mode 100644 index 08e8b92..0000000 --- a/ffmpeg/doc/examples/decoding_encoding.c +++ /dev/null @@ -1,653 +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. - * - * Note that libavcodec only handles codecs (mpeg, mpeg4, etc...), - * not file formats (avi, vob, mp4, mov, mkv, mxf, flv, mpegts, mpegps, etc...). See library 'libavformat' for the - * format handling - * @example doc/examples/decoding_encoding.c - */ - -#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_free_packet(&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_free_packet(&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 + FF_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 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_samples_get_buffer_size(NULL, c->channels, - decoded_frame->nb_samples, - c->sample_fmt, 1); - fwrite(decoded_frame->data[0], 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 mpeg1 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}; - c->gop_size = 10; /* emit one intra frame every ten frames */ - 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_free_packet(&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_free_packet(&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], - avctx->width, avctx->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 + FF_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, FF_INPUT_BUFFER_PADDING_SIZE); - - printf("Decode video file %s to %s\n", filename, outfilename); - - /* find the mpeg1 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&CODEC_CAP_TRUNCATED) - c->flags|= 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 choosen 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.sw", "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/ffmpeg/doc/examples/filtering_audio.c b/ffmpeg/doc/examples/filtering_audio.c deleted file mode 100644 index 1d66ca3..0000000 --- a/ffmpeg/doc/examples/filtering_audio.c +++ /dev/null @@ -1,282 +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 doc/examples/filtering_audio.c - */ - -#include <unistd.h> - -#include <libavcodec/avcodec.h> -#include <libavformat/avformat.h> -#include <libavfilter/avfiltergraph.h> -#include <libavfilter/avcodec.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 a 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; - } - - /* 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 ((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); - } - - avcodec_register_all(); - 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) { - avcodec_get_frame_defaults(frame); - 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_free_packet(&packet0); - } else { - /* discard non-wanted packets */ - av_free_packet(&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/ffmpeg/doc/examples/filtering_video.c b/ffmpeg/doc/examples/filtering_video.c deleted file mode 100644 index 790c641..0000000 --- a/ffmpeg/doc/examples/filtering_video.c +++ /dev/null @@ -1,263 +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 doc/examples/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/avcodec.h> -#include <libavfilter/buffersink.h> -#include <libavfilter/buffersrc.h> -#include <libavutil/opt.h> - -const char *filter_descr = "scale=78:24"; - -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(); - 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, - 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; - } - - /* 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; - } - - /* 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 ((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); - } - - avcodec_register_all(); - 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) { - avcodec_get_frame_defaults(frame); - 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_free_packet(&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/ffmpeg/doc/examples/metadata.c b/ffmpeg/doc/examples/metadata.c deleted file mode 100644 index 9c1bcd7..0000000 --- a/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 doc/examples/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/ffmpeg/doc/examples/muxing.c b/ffmpeg/doc/examples/muxing.c deleted file mode 100644 index 4cd3f65..0000000 --- a/ffmpeg/doc/examples/muxing.c +++ /dev/null @@ -1,571 +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 doc/examples/muxing.c - */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - -#include <libavutil/opt.h> -#include <libavutil/mathematics.h> -#include <libavformat/avformat.h> -#include <libswscale/swscale.h> -#include <libswresample/swresample.h> - -/* 5 seconds stream duration */ -#define STREAM_DURATION 200.0 -#define STREAM_FRAME_RATE 25 /* 25 images/s */ -#define STREAM_NB_FRAMES ((int)(STREAM_DURATION * STREAM_FRAME_RATE)) -#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */ - -static int sws_flags = SWS_BICUBIC; - -/* Add an output stream. */ -static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec, - enum AVCodecID codec_id) -{ - AVCodecContext *c; - AVStream *st; - - /* 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); - } - - st = avformat_new_stream(oc, *codec); - if (!st) { - fprintf(stderr, "Could not allocate stream\n"); - exit(1); - } - st->id = oc->nb_streams-1; - c = st->codec; - - switch ((*codec)->type) { - case AVMEDIA_TYPE_AUDIO: - c->sample_fmt = AV_SAMPLE_FMT_FLTP; - c->bit_rate = 64000; - c->sample_rate = 44100; - c->channels = 2; - 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. */ - c->time_base.den = STREAM_FRAME_RATE; - c->time_base.num = 1; - 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 |= CODEC_FLAG_GLOBAL_HEADER; - - return st; -} - -/**************************************************************/ -/* audio output */ - -static float t, tincr, tincr2; - -static uint8_t **src_samples_data; -static int src_samples_linesize; -static int src_nb_samples; - -static int max_dst_nb_samples; -uint8_t **dst_samples_data; -int dst_samples_linesize; -int dst_samples_size; - -struct SwrContext *swr_ctx = NULL; - -static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) -{ - AVCodecContext *c; - int ret; - - c = st->codec; - - /* open it */ - ret = avcodec_open2(c, codec, NULL); - if (ret < 0) { - fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret)); - exit(1); - } - - /* init signal generator */ - t = 0; - tincr = 2 * M_PI * 110.0 / c->sample_rate; - /* increment frequency by 110 Hz per second */ - tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate; - - src_nb_samples = c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ? - 10000 : c->frame_size; - - ret = av_samples_alloc_array_and_samples(&src_samples_data, &src_samples_linesize, c->channels, - src_nb_samples, AV_SAMPLE_FMT_S16, 0); - if (ret < 0) { - fprintf(stderr, "Could not allocate source samples\n"); - exit(1); - } - - /* 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 = src_nb_samples; - - /* create resampler context */ - if (c->sample_fmt != AV_SAMPLE_FMT_S16) { - swr_ctx = swr_alloc(); - if (!swr_ctx) { - fprintf(stderr, "Could not allocate resampler context\n"); - exit(1); - } - - /* set options */ - av_opt_set_int (swr_ctx, "in_channel_count", c->channels, 0); - av_opt_set_int (swr_ctx, "in_sample_rate", c->sample_rate, 0); - av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0); - av_opt_set_int (swr_ctx, "out_channel_count", c->channels, 0); - av_opt_set_int (swr_ctx, "out_sample_rate", c->sample_rate, 0); - av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", c->sample_fmt, 0); - - /* initialize the resampling context */ - if ((ret = swr_init(swr_ctx)) < 0) { - fprintf(stderr, "Failed to initialize the resampling context\n"); - exit(1); - } - - ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels, - max_dst_nb_samples, c->sample_fmt, 0); - if (ret < 0) { - fprintf(stderr, "Could not allocate destination samples\n"); - exit(1); - } - } else { - dst_samples_data = src_samples_data; - } - dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples, - c->sample_fmt, 0); -} - -/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and - * 'nb_channels' channels. */ -static void get_audio_frame(int16_t *samples, int frame_size, int nb_channels) -{ - int j, i, v; - int16_t *q; - - q = samples; - for (j = 0; j < frame_size; j++) { - v = (int)(sin(t) * 10000); - for (i = 0; i < nb_channels; i++) - *q++ = v; - t += tincr; - tincr += tincr2; - } -} - -static void write_audio_frame(AVFormatContext *oc, AVStream *st) -{ - AVCodecContext *c; - AVPacket pkt = { 0 }; // data and size must be 0; - AVFrame *frame = av_frame_alloc(); - int got_packet, ret, dst_nb_samples; - - av_init_packet(&pkt); - c = st->codec; - - get_audio_frame((int16_t *)src_samples_data[0], src_nb_samples, c->channels); - - /* convert samples from native format to destination codec format, using the resampler */ - if (swr_ctx) { - /* compute destination number of samples */ - dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, c->sample_rate) + src_nb_samples, - c->sample_rate, c->sample_rate, AV_ROUND_UP); - if (dst_nb_samples > max_dst_nb_samples) { - av_free(dst_samples_data[0]); - ret = av_samples_alloc(dst_samples_data, &dst_samples_linesize, c->channels, - dst_nb_samples, c->sample_fmt, 0); - if (ret < 0) - exit(1); - max_dst_nb_samples = dst_nb_samples; - dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, dst_nb_samples, - c->sample_fmt, 0); - } - - /* convert to destination format */ - ret = swr_convert(swr_ctx, - dst_samples_data, dst_nb_samples, - (const uint8_t **)src_samples_data, src_nb_samples); - if (ret < 0) { - fprintf(stderr, "Error while converting\n"); - exit(1); - } - } else { - dst_nb_samples = src_nb_samples; - } - - frame->nb_samples = dst_nb_samples; - avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, - dst_samples_data[0], dst_samples_size, 0); - - 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) - goto freeframe; - - pkt.stream_index = st->index; - - /* Write the compressed frame to the media file. */ - ret = av_interleaved_write_frame(oc, &pkt); - if (ret != 0) { - fprintf(stderr, "Error while writing audio frame: %s\n", - av_err2str(ret)); - exit(1); - } -freeframe: - av_frame_free(&frame); -} - -static void close_audio(AVFormatContext *oc, AVStream *st) -{ - avcodec_close(st->codec); - if (dst_samples_data != src_samples_data) { - av_free(dst_samples_data[0]); - av_free(dst_samples_data); - } - av_free(src_samples_data[0]); - av_free(src_samples_data); -} - -/**************************************************************/ -/* video output */ - -static AVFrame *frame; -static AVPicture src_picture, dst_picture; -static int frame_count; - -static void open_video(AVFormatContext *oc, AVCodec *codec, AVStream *st) -{ - int ret; - AVCodecContext *c = st->codec; - - /* open the codec */ - ret = avcodec_open2(c, codec, NULL); - if (ret < 0) { - fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret)); - exit(1); - } - - /* allocate and init a re-usable frame */ - frame = av_frame_alloc(); - if (!frame) { - fprintf(stderr, "Could not allocate video frame\n"); - exit(1); - } - - /* Allocate the encoded raw picture. */ - ret = avpicture_alloc(&dst_picture, c->pix_fmt, c->width, c->height); - if (ret < 0) { - fprintf(stderr, "Could not allocate picture: %s\n", av_err2str(ret)); - 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. */ - if (c->pix_fmt != AV_PIX_FMT_YUV420P) { - ret = avpicture_alloc(&src_picture, AV_PIX_FMT_YUV420P, c->width, c->height); - if (ret < 0) { - fprintf(stderr, "Could not allocate temporary picture: %s\n", - av_err2str(ret)); - exit(1); - } - } - - /* copy data and linesize picture pointers to frame */ - *((AVPicture *)frame) = dst_picture; -} - -/* Prepare a dummy image. */ -static void fill_yuv_image(AVPicture *pict, int frame_index, - int width, int height) -{ - int x, y, i; - - 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 void write_video_frame(AVFormatContext *oc, AVStream *st) -{ - int ret; - static struct SwsContext *sws_ctx; - AVCodecContext *c = st->codec; - - if (frame_count >= STREAM_NB_FRAMES) { - /* No more frames to compress. The codec has a latency of a few - * frames if using B-frames, so we get the last frames by - * passing the same picture again. */ - } else { - 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 (!sws_ctx) { - sws_ctx = sws_getContext(c->width, c->height, AV_PIX_FMT_YUV420P, - c->width, c->height, c->pix_fmt, - sws_flags, NULL, NULL, NULL); - if (!sws_ctx) { - fprintf(stderr, - "Could not initialize the conversion context\n"); - exit(1); - } - } - fill_yuv_image(&src_picture, frame_count, c->width, c->height); - sws_scale(sws_ctx, - (const uint8_t * const *)src_picture.data, src_picture.linesize, - 0, c->height, dst_picture.data, dst_picture.linesize); - } else { - fill_yuv_image(&dst_picture, frame_count, c->width, c->height); - } - } - - if (oc->oformat->flags & AVFMT_RAWPICTURE) { - /* Raw video case - directly store the picture in the packet */ - AVPacket pkt; - av_init_packet(&pkt); - - pkt.flags |= AV_PKT_FLAG_KEY; - pkt.stream_index = st->index; - pkt.data = dst_picture.data[0]; - pkt.size = sizeof(AVPicture); - - ret = av_interleaved_write_frame(oc, &pkt); - } else { - AVPacket pkt = { 0 }; - int got_packet; - 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 size is zero, it means the image was buffered. */ - - if (!ret && got_packet && pkt.size) { - pkt.stream_index = st->index; - - /* Write the compressed frame to the media file. */ - ret = av_interleaved_write_frame(oc, &pkt); - } else { - ret = 0; - } - } - if (ret != 0) { - fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret)); - exit(1); - } - frame_count++; -} - -static void close_video(AVFormatContext *oc, AVStream *st) -{ - avcodec_close(st->codec); - av_free(src_picture.data[0]); - av_free(dst_picture.data[0]); - av_free(frame); -} - -/**************************************************************/ -/* media file output */ - -int main(int argc, char **argv) -{ - const char *filename; - AVOutputFormat *fmt; - AVFormatContext *oc; - AVStream *audio_st, *video_st; - AVCodec *audio_codec, *video_codec; - double audio_time, video_time; - int ret; - - /* 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]; - - /* 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. */ - video_st = NULL; - audio_st = NULL; - - if (fmt->video_codec != AV_CODEC_ID_NONE) { - video_st = add_stream(oc, &video_codec, fmt->video_codec); - } - if (fmt->audio_codec != AV_CODEC_ID_NONE) { - audio_st = add_stream(oc, &audio_codec, fmt->audio_codec); - } - - /* Now that all the parameters are set, we can open the audio and - * video codecs and allocate the necessary encode buffers. */ - if (video_st) - open_video(oc, video_codec, video_st); - if (audio_st) - open_audio(oc, audio_codec, audio_st); - - 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, NULL); - if (ret < 0) { - fprintf(stderr, "Error occurred when opening output file: %s\n", - av_err2str(ret)); - return 1; - } - - if (frame) - frame->pts = 0; - for (;;) { - /* Compute current audio and video time. */ - audio_time = audio_st ? audio_st->pts.val * av_q2d(audio_st->time_base) : 0.0; - video_time = video_st ? video_st->pts.val * av_q2d(video_st->time_base) : 0.0; - - if ((!audio_st || audio_time >= STREAM_DURATION) && - (!video_st || video_time >= STREAM_DURATION)) - break; - - /* write interleaved audio and video frames */ - if (!video_st || (video_st && audio_st && audio_time < video_time)) { - write_audio_frame(oc, audio_st); - } else { - write_video_frame(oc, video_st); - frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base); - } - } - - /* 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 (video_st) - close_video(oc, video_st); - if (audio_st) - close_audio(oc, audio_st); - - if (!(fmt->flags & AVFMT_NOFILE)) - /* Close the output file. */ - avio_close(oc->pb); - - /* free the stream */ - avformat_free_context(oc); - - return 0; -} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libavcodec.pc b/ffmpeg/doc/examples/pc-uninstalled/libavcodec.pc deleted file mode 100644 index a87ded7..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libavcodec.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libavcodec -includedir=${pcfiledir}/../../.. - -Name: libavcodec -Description: FFmpeg codec library -Version: 55.46.100 -Requires: libavutil = 52.59.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lavcodec -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libavdevice.pc b/ffmpeg/doc/examples/pc-uninstalled/libavdevice.pc deleted file mode 100644 index 7f05a29..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libavdevice.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libavdevice -includedir=${pcfiledir}/../../.. - -Name: libavdevice -Description: FFmpeg device handling library -Version: 55.5.102 -Requires: libavfilter = 4.0.103, libavformat = 55.22.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lavdevice -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libavfilter.pc b/ffmpeg/doc/examples/pc-uninstalled/libavfilter.pc deleted file mode 100644 index b42f95d..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libavfilter.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libavfilter -includedir=${pcfiledir}/../../.. - -Name: libavfilter -Description: FFmpeg audio/video filtering library -Version: 4.0.103 -Requires: libpostproc = 52.3.100, libswresample = 0.17.104, libswscale = 2.5.101, libavformat = 55.22.100, libavcodec = 55.46.100, libavutil = 52.59.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lavfilter -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libavformat.pc b/ffmpeg/doc/examples/pc-uninstalled/libavformat.pc deleted file mode 100644 index 8bab324..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libavformat.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libavformat -includedir=${pcfiledir}/../../.. - -Name: libavformat -Description: FFmpeg container format library -Version: 55.22.100 -Requires: libavcodec = 55.46.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lavformat -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libavutil.pc b/ffmpeg/doc/examples/pc-uninstalled/libavutil.pc deleted file mode 100644 index 85df0f0..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libavutil.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libavutil -includedir=${pcfiledir}/../../.. - -Name: libavutil -Description: FFmpeg utility library -Version: 52.59.100 -Requires: -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lavutil -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libpostproc.pc b/ffmpeg/doc/examples/pc-uninstalled/libpostproc.pc deleted file mode 100644 index 94da503..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libpostproc.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libpostproc -includedir=${pcfiledir}/../../.. - -Name: libpostproc -Description: FFmpeg postprocessing library -Version: 52.3.100 -Requires: libavutil = 52.59.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lpostproc -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libswresample.pc b/ffmpeg/doc/examples/pc-uninstalled/libswresample.pc deleted file mode 100644 index 45bfa4a..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libswresample.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libswresample -includedir=${pcfiledir}/../../.. - -Name: libswresample -Description: FFmpeg audio resampling library -Version: 0.17.104 -Requires: libavutil = 52.59.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lswresample -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/pc-uninstalled/libswscale.pc b/ffmpeg/doc/examples/pc-uninstalled/libswscale.pc deleted file mode 100644 index 8693580..0000000 --- a/ffmpeg/doc/examples/pc-uninstalled/libswscale.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix= -exec_prefix= -libdir=${pcfiledir}/../../../libswscale -includedir=${pcfiledir}/../../.. - -Name: libswscale -Description: FFmpeg image rescaling library -Version: 2.5.101 -Requires: libavutil = 52.59.100 -Conflicts: -Libs: -L${libdir} -Wl,-rpath,${libdir} -lswscale -Cflags: -I${includedir} diff --git a/ffmpeg/doc/examples/resampling_audio.c b/ffmpeg/doc/examples/resampling_audio.c deleted file mode 100644 index a15e042..0000000 --- a/ffmpeg/doc/examples/resampling_audio.c +++ /dev/null @@ -1,215 +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 doc/examples/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_free(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: - if (dst_file) - 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/ffmpeg/doc/examples/scaling_video.c b/ffmpeg/doc/examples/scaling_video.c deleted file mode 100644 index be2c510..0000000 --- a/ffmpeg/doc/examples/scaling_video.c +++ /dev/null @@ -1,141 +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 doc/examples/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: - if (dst_file) - fclose(dst_file); - av_freep(&src_data[0]); - av_freep(&dst_data[0]); - sws_freeContext(sws_ctx); - return ret < 0; -} |
