diff -uarN ffmpeg-r23357/configure ffmpeg-r23357.new/configure --- ffmpeg-r23357/configure 2010-05-28 01:00:29.000000000 +0200 +++ ffmpeg-r23357.new/configure 2010-05-28 14:13:45.000000000 +0200 @@ -1352,6 +1352,7 @@ libtheora_encoder_deps="libtheora" libvorbis_encoder_deps="libvorbis" libvpx_decoder_deps="libvpx" +libvpx_encoder_deps="libvpx" libx264_encoder_deps="libx264" libxvid_encoder_deps="libxvid" @@ -2621,7 +2622,8 @@ enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg enabled libvorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg -enabled libvpx && require2 libvpx "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_dec_init_ver" -lvpx +enabled libvpx && require2 libvpx "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_dec_init_ver" -lvpx && + require2 libvpx "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver" -lvpx enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 -lm && { check_cpp_condition x264.h "X264_BUILD >= 90" || die "ERROR: libx264 version must be >= 0.90."; } diff -uarN ffmpeg-r23357/libavcodec/Makefile ffmpeg-r23357.new/libavcodec/Makefile --- ffmpeg-r23357/libavcodec/Makefile 2010-05-28 14:15:18.000000000 +0200 +++ ffmpeg-r23357.new/libavcodec/Makefile 2010-05-28 14:12:41.000000000 +0200 @@ -538,6 +538,7 @@ OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbis.o OBJS-$(CONFIG_LIBVPX_DECODER) += libvpxdec.o +OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvidff.o libxvid_rc.o diff -uarN ffmpeg-r23357/libavcodec/allcodecs.c ffmpeg-r23357.new/libavcodec/allcodecs.c --- ffmpeg-r23357/libavcodec/allcodecs.c 2010-05-28 14:15:18.000000000 +0200 +++ ffmpeg-r23357.new/libavcodec/allcodecs.c 2010-05-28 14:12:41.000000000 +0200 @@ -349,7 +349,7 @@ REGISTER_DECODER (LIBSPEEX, libspeex); REGISTER_ENCODER (LIBTHEORA, libtheora); REGISTER_ENCODER (LIBVORBIS, libvorbis); - REGISTER_DECODER (LIBVPX, libvpx); + REGISTER_ENCDEC (LIBVPX, libvpx); REGISTER_ENCODER (LIBX264, libx264); REGISTER_ENCODER (LIBXVID, libxvid); diff -uarN ffmpeg-r23357/libavcodec/libvpxdec.c ffmpeg-r23357.new/libavcodec/libvpxdec.c --- ffmpeg-r23357/libavcodec/libvpxdec.c 2010-05-28 14:15:18.000000000 +0200 +++ ffmpeg-r23357.new/libavcodec/libvpxdec.c 2010-05-28 14:13:10.000000000 +0200 @@ -24,8 +24,8 @@ */ #define VPX_CODEC_DISABLE_COMPAT 1 -#include -#include +#include +#include #include "avcodec.h" @@ -70,130 +70,6 @@ if (vpx_codec_decode(&ctx->decoder, avpkt->data, avpkt->size, NULL, 0) != VPX_CODEC_OK) { - const char *error = vpx_codec_error(&ctx->decoder); - const char *detail = vpx_codec_error_detail(&ctx->decoder); - - av_log(avctx, AV_LOG_ERROR, "Failed to decode frame: %s\n", error); - if (detail) - av_log(avctx, AV_LOG_ERROR, " Additional information: %s\n", - detail); - return AVERROR_INVALIDDATA; - } - - if ((img = vpx_codec_get_frame(&ctx->decoder, &iter))) { - if (img->fmt != VPX_IMG_FMT_I420) { - av_log(avctx, AV_LOG_ERROR, "Unsupported output colorspace (%d)\n", - img->fmt); - return AVERROR_INVALIDDATA; - } - - if ((int) img->d_w != avctx->width || (int) img->d_h != avctx->height) { - av_log(avctx, AV_LOG_INFO, "dimension change! %dx%d -> %dx%d\n", - avctx->width, avctx->height, img->d_w, img->d_h); - if (avcodec_check_dimensions(avctx, img->d_w, img->d_h)) - return AVERROR_INVALIDDATA; - avcodec_set_dimensions(avctx, img->d_w, img->d_h); - } - picture->data[0] = img->planes[0]; - picture->data[1] = img->planes[1]; - picture->data[2] = img->planes[2]; - picture->data[3] = NULL; - picture->linesize[0] = img->stride[0]; - picture->linesize[1] = img->stride[1]; - picture->linesize[2] = img->stride[2]; - picture->linesize[3] = 0; - *data_size = sizeof(AVPicture); - } - return avpkt->size; -} - -static av_cold int vp8_free(AVCodecContext *avctx) -{ - VP8Context *ctx = avctx->priv_data; - vpx_codec_destroy(&ctx->decoder); - return 0; -} - -AVCodec libvpx_decoder = { - "libvpx", - AVMEDIA_TYPE_VIDEO, - CODEC_ID_VP8, - sizeof(VP8Context), - vp8_init, - NULL, /* encode */ - vp8_free, - vp8_decode, - 0, /* capabilities */ - .long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"), -}; -/* - * Copyright (c) 2010, Google, Inc. - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * VP8 decoder support via libvpx - */ - -#define VPX_CODEC_DISABLE_COMPAT 1 -#include -#include - -#include "avcodec.h" - -typedef struct VP8DecoderContext { - struct vpx_codec_ctx decoder; -} VP8Context; - -static av_cold int vp8_init(AVCodecContext *avctx) -{ - VP8Context *ctx = avctx->priv_data; - const struct vpx_codec_iface *iface = &vpx_codec_vp8_dx_algo; - struct vpx_codec_dec_cfg deccfg = { - /* token partitions+1 would be a decent choice */ - .threads = FFMIN(avctx->thread_count, 16) - }; - - av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str()); - av_log(avctx, AV_LOG_VERBOSE, "%s\n", vpx_codec_build_config()); - - if (vpx_codec_dec_init(&ctx->decoder, iface, &deccfg, 0) != VPX_CODEC_OK) { - const char *error = vpx_codec_error(&ctx->decoder); - av_log(avctx, AV_LOG_ERROR, "Failed to initialize decoder: %s\n", - error); - return AVERROR(EINVAL); - } - - avctx->pix_fmt = PIX_FMT_YUV420P; - return 0; -} - -static int vp8_decode(AVCodecContext *avctx, - void *data, int *data_size, AVPacket *avpkt) -{ - VP8Context *ctx = avctx->priv_data; - AVFrame *picture = data; - const void *iter = NULL; - struct vpx_image *img; - - if (vpx_codec_decode(&ctx->decoder, avpkt->data, avpkt->size, NULL, 0) != - VPX_CODEC_OK) { const char *error = vpx_codec_error(&ctx->decoder); const char *detail = vpx_codec_error_detail(&ctx->decoder); diff -uarN ffmpeg-r23357/libavcodec/libvpxenc.c ffmpeg-r23357.new/libavcodec/libvpxenc.c --- ffmpeg-r23357/libavcodec/libvpxenc.c 2010-05-28 14:15:18.000000000 +0200 +++ ffmpeg-r23357.new/libavcodec/libvpxenc.c 2010-05-29 00:40:49.000000000 +0200 @@ -66,9 +66,10 @@ #ifndef HAVE_STDINT_H # define HAVE_STDINT_H 1 #endif +#include #define VPX_CODEC_DISABLE_COMPAT 1 -#include -#include +#include +#include /** * Portion of #vpx_codec_cx_pkt_t from vpx_encoder.h. diff -uarN ffmpeg-r23357/libavformat/matroskadec.c ffmpeg-r23357.new/libavformat/matroskadec.c --- ffmpeg-r23357/libavformat/matroskadec.c 2010-05-28 01:00:29.000000000 +0200 +++ ffmpeg-r23357.new/libavformat/matroskadec.c 2010-05-28 14:12:41.000000000 +0200 @@ -1155,8 +1155,10 @@ return AVERROR_PATCHWELCOME; } for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++) - if (!strcmp(ebml.doctype, matroska_doctypes[i])) + if (!strcmp(ebml.doctype, matroska_doctypes[i])) { + av_metadata_set2(&s->metadata, "doctype", ebml.doctype, 0); break; + } if (i >= FF_ARRAY_ELEMS(matroska_doctypes)) { av_log(s, AV_LOG_WARNING, "Unknown EBML doctype '%s'\n", ebml.doctype); } diff -uarN ffmpeg-r23357/libavformat/matroskaenc.c ffmpeg-r23357.new/libavformat/matroskaenc.c --- ffmpeg-r23357/libavformat/matroskaenc.c 2010-05-28 14:15:18.000000000 +0200 +++ ffmpeg-r23357.new/libavformat/matroskaenc.c 2010-05-28 14:12:41.000000000 +0200 @@ -585,9 +585,17 @@ switch (codec->codec_type) { case AVMEDIA_TYPE_VIDEO: +#if CONFIG_WEBM_MUXER + if (codec->codec_id != CODEC_ID_VP8 && + !strcmp("webm", s->oformat->name)) { + av_log(s, AV_LOG_INFO, "WebM only supports VP8 video.\n"); + return -1; + } +#endif put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9); +#if CONFIG_MATROSKA_MUXER if (!native_id && ff_codec_get_tag(codec_movvideo_tags, codec->codec_id) && (!ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id)