From: Clément Bœsch Date: Wed, 29 Mar 2017 12:07:39 +0000 (+0200) Subject: Merge commit '7b1f03477f1a43d2261fbd83e50a4ad90c7f806d' X-Git-Tag: n3.4-dev~205 X-Git-Url: http://git.ffmpeg.org/gitweb/ffmpeg.git/commitdiff_plain/925ce244d873fb6a0cda0da6e1f8d34dc721ea53 Merge commit '7b1f03477f1a43d2261fbd83e50a4ad90c7f806d' * commit '7b1f03477f1a43d2261fbd83e50a4ad90c7f806d': examples/avcodec: split the remaining two examples into separate files Merged-by: Clément Bœsch --- 925ce244d873fb6a0cda0da6e1f8d34dc721ea53 diff --cc configure index 71a2734,9264bb5..a63169d --- a/configure +++ b/configure @@@ -1459,40 -1209,32 +1459,41 @@@ COMPONENT_LIST= " EXAMPLE_LIST=" + avio_dir_cmd_example + avio_reading_example decode_audio_example - decoding_encoding_example + decode_video_example + demuxing_decoding_example encode_audio_example + encode_video_example + extract_mvs_example filter_audio_example + filtering_audio_example + filtering_video_example + http_multiclient_example metadata_example - output_example + muxing_example qsvdec_example + remuxing_example + resampling_audio_example + scaling_video_example transcode_aac_example + transcoding_example " - -HWACCEL_LIBRARY_NONFREE_LIST=" - cuda - libnpp -" -HWACCEL_LIBRARY_LIST=" - $HWACCEL_LIBRARY_NONFREE_LIST - d3d11va - dxva2 - libmfx - mmal - nvenc - omx - vaapi - vda - vdpau +EXTERNAL_AUTODETECT_LIBRARY_LIST=" + bzlib + iconv + libxcb + libxcb_shm + libxcb_shape + libxcb_xfixes + lzma + schannel + sdl + sdl2 + securetransport + xlib + zlib " EXTERNAL_LIBRARY_GPL_LIST=" @@@ -3167,25 -2437,15 +3168,26 @@@ zscale_filter_deps="libzimg scale_vaapi_filter_deps="vaapi VAProcPipelineParameterBuffer" # examples +avio_dir_cmd_deps="avformat avutil" +avio_reading_deps="avformat avcodec avutil" decode_audio_example_deps="avcodec avutil" - decoding_encoding_example_deps="avcodec avformat avutil" + decode_video_example_deps="avcodec avutil" +demuxing_decoding_example_deps="avcodec avformat avutil" encode_audio_example_deps="avcodec avutil" + encode_video_example_deps="avcodec avutil" +extract_mvs_example_deps="avcodec avformat avutil" filter_audio_example_deps="avfilter avutil" +filtering_audio_example_deps="avfilter avcodec avformat avutil" +filtering_video_example_deps="avfilter avcodec avformat avutil" +http_multiclient_example_deps="avformat avutil fork" metadata_example_deps="avformat avutil" -output_example_deps="avcodec avformat avutil swscale" +muxing_example_deps="avcodec avformat avutil swscale" qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder vaapi_x11" -transcode_aac_example_deps="avcodec avformat avresample" +remuxing_example_deps="avcodec avformat avutil" +resampling_audio_example_deps="avutil swresample" +scaling_video_example_deps="avutil swscale" +transcode_aac_example_deps="avcodec avformat swresample" +transcoding_example_deps="avfilter avcodec avformat avutil" # libraries, in linking order avcodec_deps="avutil" diff --cc doc/Makefile index d76139a,bda8153..c193fc3 --- a/doc/Makefile +++ b/doc/Makefile @@@ -27,44 -11,33 +27,45 @@@ HTMLPAGES = $(AVPROGS-yes:%=doc/%.htm doc/nut.html \ doc/platform.html \ -DOCS-$(CONFIG_POD2MAN) += $(MANPAGES) $(PODPAGES) -DOCS-$(CONFIG_TEXI2HTML) += $(HTMLPAGES) +TXTPAGES = doc/fate.txt \ + + +DOCS-$(CONFIG_HTMLPAGES) += $(HTMLPAGES) +DOCS-$(CONFIG_PODPAGES) += $(PODPAGES) +DOCS-$(CONFIG_MANPAGES) += $(MANPAGES) +DOCS-$(CONFIG_TXTPAGES) += $(TXTPAGES) DOCS = $(DOCS-yes) -DOC_EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE) += decode_audio -DOC_EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video -DOC_EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio -DOC_EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video -DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio -DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata -DOC_EXAMPLES-$(CONFIG_OUTPUT_EXAMPLE) += output -DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec -DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE) += transcode_aac -ALL_DOC_EXAMPLES = decode_audio \ - decode_video \ - encode_audio \ - encode_video \ - filter_audio \ - metadata output \ - transcode_aac \ - -DOC_EXAMPLES := $(DOC_EXAMPLES-yes:%=doc/examples/%$(EXESUF)) -ALL_DOC_EXAMPLES := $(ALL_DOC_EXAMPLES:%=doc/examples/%$(EXESUF)) -PROGS += $(DOC_EXAMPLES) - -all: $(DOCS) +DOC_EXAMPLES-$(CONFIG_AVIO_DIR_CMD_EXAMPLE) += avio_dir_cmd +DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading +DOC_EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE) += decode_audio - DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding ++DOC_EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video +DOC_EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding +DOC_EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio ++DOC_EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video +DOC_EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs +DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio +DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio +DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video +DOC_EXAMPLES-$(CONFIG_HTTP_MULTICLIENT_EXAMPLE) += http_multiclient +DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata +DOC_EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing +DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec +DOC_EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing +DOC_EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio +DOC_EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video +DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE) += transcode_aac +DOC_EXAMPLES-$(CONFIG_TRANSCODING_EXAMPLE) += transcoding +ALL_DOC_EXAMPLES_LIST = $(DOC_EXAMPLES-) $(DOC_EXAMPLES-yes) + +DOC_EXAMPLES := $(DOC_EXAMPLES-yes:%=doc/examples/%$(PROGSSUF)$(EXESUF)) +ALL_DOC_EXAMPLES := $(ALL_DOC_EXAMPLES_LIST:%=doc/examples/%$(PROGSSUF)$(EXESUF)) +ALL_DOC_EXAMPLES_G := $(ALL_DOC_EXAMPLES_LIST:%=doc/examples/%$(PROGSSUF)_g$(EXESUF)) +PROGS += $(DOC_EXAMPLES) + +all-$(CONFIG_DOC): doc + +doc: documentation apidoc: doc/doxy/html documentation: $(DOCS) diff --cc doc/examples/.gitignore index ee10e07,3f60af7..6bd9dc1 --- a/doc/examples/.gitignore +++ b/doc/examples/.gitignore @@@ -1,20 -1,5 +1,21 @@@ -/avcodec +/avio_dir_cmd +/avio_reading +/decode_audio - /decoding_encoding ++/decode_video +/demuxing_decoding +/encode_audio ++/encode_video +/extract_mvs /filter_audio +/filtering_audio +/filtering_video +/http_multiclient /metadata -/output +/muxing +/pc-uninstalled +/qsvdec +/remuxing +/resampling_audio +/scaling_video /transcode_aac +/transcoding diff --cc doc/examples/Makefile index 3f33c22,0000000..2d0a306 mode 100644,000000..100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@@ -1,48 -1,0 +1,49 @@@ +# 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 \ + decode_audio \ - decoding_encoding \ ++ decode_video \ + demuxing_decoding \ + encode_audio \ ++ encode_video \ + 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 +encode_audio: 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 --cc doc/examples/decode_video.c index 0000000,20d11da..1597653 mode 000000,100644..100644 --- a/doc/examples/decode_video.c +++ b/doc/examples/decode_video.c @@@ -1,0 -1,178 +1,182 @@@ + /* - * copyright (c) 2001 Fabrice Bellard ++ * Copyright (c) 2001 Fabrice Bellard + * - * This file is part of Libav. ++ * 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: + * - * Libav 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. ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. + * - * Libav 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 Libav; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ * 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 + * video decoding with libavcodec API example + * + * @example decode_video.c + */ + + #include + #include + #include + -#include "libavcodec/avcodec.h" - -#include "libavutil/common.h" -#include "libavutil/imgutils.h" -#include "libavutil/mathematics.h" ++#include + + #define INBUF_SIZE 4096 + + 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;idata[0], frame->linesize[0], ++ frame->width, frame->height, buf); ++ (*frame_count)++; ++ } ++ if (pkt->data) { ++ pkt->size -= len; ++ pkt->data += len; ++ } ++ return 0; ++} ++ + int main(int argc, char **argv) + { + const char *filename, *outfilename; + AVCodec *codec; + AVCodecContext *c= NULL; - int frame, got_picture, len; ++ int frame_count; + FILE *f; - AVFrame *picture; ++ AVFrame *frame; + uint8_t inbuf[INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; - char buf[1024]; + AVPacket avpkt; + + if (argc <= 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(0); + } + filename = argv[1]; + outfilename = argv[2]; + + avcodec_register_all(); + + 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); + + /* find the MPEG-1 video decoder */ + codec = avcodec_find_decoder(AV_CODEC_ID_MPEG1VIDEO); + if (!codec) { - fprintf(stderr, "codec not found\n"); ++ fprintf(stderr, "Codec not found\n"); + exit(1); + } + + c = avcodec_alloc_context3(codec); - picture = av_frame_alloc(); ++ 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"); ++ fprintf(stderr, "Could not open codec\n"); + exit(1); + } + - /* the codec gives us the frame size, in samples */ - + f = fopen(filename, "rb"); + if (!f) { - fprintf(stderr, "could not open %s\n", filename); ++ fprintf(stderr, "Could not open %s\n", filename); + exit(1); + } + - frame = 0; - for(;;) { ++ 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) { - len = avcodec_decode_video2(c, picture, &got_picture, &avpkt); - if (len < 0) { - fprintf(stderr, "Error while decoding frame %d\n", frame); ++ while (avpkt.size > 0) ++ if (decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 0) < 0) + exit(1); - } - if (got_picture) { - printf("saving frame %3d\n", frame); - fflush(stdout); - - /* the picture is allocated by the decoder. no need to - free it */ - snprintf(buf, sizeof(buf), outfilename, frame); - pgm_save(picture->data[0], picture->linesize[0], - c->width, c->height, buf); - frame++; - } - avpkt.size -= len; - avpkt.data += len; - } + } + + /* 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; - len = avcodec_decode_video2(c, picture, &got_picture, &avpkt); - if (got_picture) { - printf("saving last frame %3d\n", frame); - fflush(stdout); - - /* the picture is allocated by the decoder. no need to - free it */ - snprintf(buf, sizeof(buf), outfilename, frame); - pgm_save(picture->data[0], picture->linesize[0], - c->width, c->height, buf); - frame++; - } ++ decode_write_frame(outfilename, c, frame, &frame_count, &avpkt, 1); + + fclose(f); + + avcodec_free_context(&c); - av_frame_free(&picture); ++ av_frame_free(&frame); + + return 0; + } diff --cc doc/examples/encode_video.c index 0000000,ca93472..71c8c0b mode 000000,100644..100644 --- a/doc/examples/encode_video.c +++ b/doc/examples/encode_video.c @@@ -1,0 -1,164 +1,187 @@@ + /* - * copyright (c) 2001 Fabrice Bellard ++ * Copyright (c) 2001 Fabrice Bellard + * - * This file is part of Libav. ++ * 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: + * - * Libav 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. ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. + * - * Libav 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 Libav; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ * 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 + * video encoding with libavcodec API example + * + * @example encode_video.c + */ + + #include + #include + #include + -#include "libavcodec/avcodec.h" ++#include + -#include "libavutil/frame.h" -#include "libavutil/imgutils.h" ++#include ++#include + + int main(int argc, char **argv) + { - const char *filename; ++ const char *filename, *codec_name; + AVCodec *codec; + AVCodecContext *c= NULL; + int i, ret, x, y, got_output; + FILE *f; - AVFrame *picture; ++ AVFrame *frame; + AVPacket pkt; + uint8_t endcode[] = { 0, 0, 1, 0xb7 }; + - if (argc <= 1) { - fprintf(stderr, "Usage: %s \n", argv[0]); ++ if (argc <= 2) { ++ fprintf(stderr, "Usage: %s \n", argv[0]); + exit(0); + } + filename = argv[1]; ++ codec_name = argv[2]; + + avcodec_register_all(); + + /* find the mpeg1video encoder */ - codec = avcodec_find_encoder(AV_CODEC_ID_MPEG1VIDEO); ++ codec = avcodec_find_encoder_by_name(codec_name); + if (!codec) { - fprintf(stderr, "codec not found\n"); ++ fprintf(stderr, "Codec not found\n"); + exit(1); + } + + c = avcodec_alloc_context3(codec); - picture = av_frame_alloc(); ++ 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->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"); ++ fprintf(stderr, "Could not open codec\n"); + exit(1); + } + + f = fopen(filename, "wb"); + if (!f) { - fprintf(stderr, "could not open %s\n", filename); ++ 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; + - ret = av_image_alloc(picture->data, picture->linesize, c->width, 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 alloc raw picture buffer\n"); ++ fprintf(stderr, "Could not allocate raw picture buffer\n"); + exit(1); + } - picture->format = c->pix_fmt; - picture->width = c->width; - picture->height = c->height; + + /* encode 1 second of video */ - for(i=0;i<25;i++) { ++ 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;yheight;y++) { - for(x=0;xwidth;x++) { - picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3; ++ 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;yheight/2;y++) { - for(x=0;xwidth/2;x++) { - picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2; - picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5; ++ 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; + } + } + - picture->pts = i; ++ frame->pts = i; + + /* encode the image */ - ret = avcodec_encode_video2(c, &pkt, picture, &got_output); ++ ret = avcodec_encode_video2(c, &pkt, frame, &got_output); + if (ret < 0) { - fprintf(stderr, "error encoding frame\n"); ++ fprintf(stderr, "Error encoding frame\n"); + exit(1); + } + + if (got_output) { - printf("encoding frame %3d (size=%5d)\n", i, pkt.size); ++ 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"); ++ fprintf(stderr, "Error encoding frame\n"); + exit(1); + } + + if (got_output) { - printf("encoding frame %3d (size=%5d)\n", i, pkt.size); ++ 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_free_context(&c); - av_freep(&picture->data[0]); - av_frame_free(&picture); ++ av_freep(&frame->data[0]); ++ av_frame_free(&frame); + + return 0; + }