Merge commit '1839fafa951308237c4672ffd9a94f927b26eac7'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 12 May 2014 00:34:01 +0000 (02:34 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 12 May 2014 00:44:28 +0000 (02:44 +0200)
* commit '1839fafa951308237c4672ffd9a94f927b26eac7':
  avconv: Support VDA hwaccel

Conflicts:
Makefile

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Makefile
doc/ffmpeg.texi
ffmpeg.h
ffmpeg_opt.c
ffmpeg_vda.c

diff --cc Makefile
+++ b/Makefile
@@@ -2,39 -1,86 +2,40 @@@ MAIN_MAKEFILE=
  include config.mak
  
  vpath %.c    $(SRC_PATH)
 +vpath %.cpp  $(SRC_PATH)
  vpath %.h    $(SRC_PATH)
 +vpath %.m    $(SRC_PATH)
  vpath %.S    $(SRC_PATH)
  vpath %.asm  $(SRC_PATH)
 +vpath %.rc   $(SRC_PATH)
  vpath %.v    $(SRC_PATH)
  vpath %.texi $(SRC_PATH)
 +vpath %/fate_config.sh.template $(SRC_PATH)
  
 -ifndef V
 -Q      = @
 -ECHO   = printf "$(1)\t%s\n" $(2)
 -BRIEF  = CC HOSTCC HOSTLD AS YASM AR LD
 -SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM STRIP
 -MSG    = $@
 -M      = @$(call ECHO,$(TAG),$@);
 -$(foreach VAR,$(BRIEF), \
 -    $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
 -$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
 -$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_PATH)/%=%)); $(INSTALL))
 -endif
 -
 -ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil swscale
 -
 -IFLAGS     := -I. -I$(SRC_PATH)
 -CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
 -CFLAGS     += $(ECFLAGS)
 -CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
 -ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
 -YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm
 -HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
 -LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
 -
 -define COMPILE
 -      $(call $(1)DEP,$(1))
 -      $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
 -endef
 -
 -COMPILE_C = $(call COMPILE,CC)
 -COMPILE_S = $(call COMPILE,AS)
 -COMPILE_HOSTC = $(call COMPILE,HOSTCC)
 -
 -%.o: %.c
 -      $(COMPILE_C)
 -
 -%.o: %.S
 -      $(COMPILE_S)
 +AVPROGS-$(CONFIG_FFMPEG)   += ffmpeg
 +AVPROGS-$(CONFIG_FFPLAY)   += ffplay
 +AVPROGS-$(CONFIG_FFPROBE)  += ffprobe
 +AVPROGS-$(CONFIG_FFSERVER) += ffserver
  
 -%_host.o: %.c
 -      $(COMPILE_HOSTC)
 -
 -%.i: %.c
 -      $(CC) $(CCFLAGS) $(CC_E) $<
 -
 -%.h.c:
 -      $(Q)echo '#include "$*.h"' >$@
 -
 -%.ver: %.v
 -      $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
 -
 -%.c %.h: TAG = GEN
 -
 -AVPROGS-$(CONFIG_AVCONV)   += avconv
 -AVPROGS-$(CONFIG_AVPLAY)   += avplay
 -AVPROGS-$(CONFIG_AVPROBE)  += avprobe
 -AVPROGS-$(CONFIG_AVSERVER) += avserver
 -
 -AVPROGS    := $(AVPROGS-yes:%=%$(EXESUF))
 +AVPROGS    := $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF))
 +INSTPROGS   = $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF))
  PROGS      += $(AVPROGS)
  
 -AVBASENAMES = avconv avplay avprobe avserver
 -ALLAVPROGS  = $(AVBASENAMES:%=%$(EXESUF))
 +AVBASENAMES  = ffmpeg ffplay ffprobe ffserver
 +ALLAVPROGS   = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF))
 +ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
  
  $(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog) += cmdutils.o))
 +$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog)-$(CONFIG_OPENCL) += cmdutils_opencl.o))
  
 -OBJS-avconv                   += avconv_opt.o avconv_filter.o
 -OBJS-avconv-$(HAVE_VDPAU_X11) += avconv_vdpau.o
 -OBJS-avconv-$(HAVE_DXVA2_LIB) += avconv_dxva2.o
 -OBJS-avconv-$(CONFIG_VDA)     += avconv_vda.o
 +OBJS-ffmpeg                   += ffmpeg_opt.o ffmpeg_filter.o
 +OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
 +OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
++OBJS-ffmpeg-$(CONFIG_VDA)     += ffmpeg_vda.o
  
 -TESTTOOLS   = audiogen videogen rotozoom tiny_psnr base64
 +TESTTOOLS   = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
  HOSTPROGS  := $(TESTTOOLS:%=tests/%) doc/print_options
 -TOOLS       = qt-faststart trasher
 +TOOLS       = qt-faststart trasher uncoded_frame
  TOOLS-$(CONFIG_ZLIB) += cws2fws
  
  FFLIBS-$(CONFIG_AVDEVICE) += avdevice
diff --cc doc/ffmpeg.texi
Simple merge
diff --cc ffmpeg.h
+++ b/ffmpeg.h
@@@ -514,5 -424,6 +515,6 @@@ int ffmpeg_parse_options(int argc, cha
  
  int vdpau_init(AVCodecContext *s);
  int dxva2_init(AVCodecContext *s);
+ int vda_init(AVCodecContext *s);
  
 -#endif /* AVCONV_H */
 +#endif /* FFMPEG_H */
diff --cc ffmpeg_opt.c
Simple merge
diff --cc ffmpeg_vda.c
index 0000000,40f87c4..b9f0975
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,134 +1,134 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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
 -#include "avconv.h"
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "libavcodec/avcodec.h"
+ #include "libavcodec/vda.h"
+ #include "libavutil/imgutils.h"
++#include "ffmpeg.h"
+ typedef struct VDAContext {
+     AVFrame *tmp_frame;
+ } VDAContext;
+ static int vda_retrieve_data(AVCodecContext *s, AVFrame *frame)
+ {
+     InputStream *ist = s->opaque;
+     VDAContext  *vda = ist->hwaccel_ctx;
+     CVPixelBufferRef pixbuf = (CVPixelBufferRef)frame->data[3];
+     OSType pixel_format = CVPixelBufferGetPixelFormatType(pixbuf);
+     CVReturn err;
+     uint8_t *data[4] = { 0 };
+     int linesize[4] = { 0 };
+     int planes, ret, i;
+     av_frame_unref(vda->tmp_frame);
+     switch (pixel_format) {
+     case kCVPixelFormatType_420YpCbCr8Planar: vda->tmp_frame->format = AV_PIX_FMT_YUV420P; break;
+     case kCVPixelFormatType_422YpCbCr8:       vda->tmp_frame->format = AV_PIX_FMT_UYVY422; break;
+     default:
+         av_log(NULL, AV_LOG_ERROR,
+                "Unsupported pixel format: %u\n", pixel_format);
+         return AVERROR(ENOSYS);
+     }
+     vda->tmp_frame->width  = frame->width;
+     vda->tmp_frame->height = frame->height;
+     ret = av_frame_get_buffer(vda->tmp_frame, 32);
+     if (ret < 0)
+         return ret;
+     err = CVPixelBufferLockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
+     if (err != kCVReturnSuccess) {
+         av_log(NULL, AV_LOG_ERROR, "Error locking the pixel buffer.\n");
+         return AVERROR_UNKNOWN;
+     }
+     if (CVPixelBufferIsPlanar(pixbuf)) {
+         planes = CVPixelBufferGetPlaneCount(pixbuf);
+         for (i = 0; i < planes; i++) {
+             data[i]     = CVPixelBufferGetBaseAddressOfPlane(pixbuf, i);
+             linesize[i] = CVPixelBufferGetBytesPerRowOfPlane(pixbuf, i);
+         }
+     } else {
+         data[0] = CVPixelBufferGetBaseAddress(pixbuf);
+         linesize[0] = CVPixelBufferGetBytesPerRow(pixbuf);
+     }
+     av_image_copy(vda->tmp_frame->data, vda->tmp_frame->linesize,
+                   data, linesize, vda->tmp_frame->format,
+                   frame->width, frame->height);
+     ret = av_frame_copy_props(vda->tmp_frame, frame);
+     if (ret < 0)
+         return ret;
+     av_frame_unref(frame);
+     av_frame_move_ref(frame, vda->tmp_frame);
+     return 0;
+ }
+ static void vda_uninit(AVCodecContext *s)
+ {
+     InputStream *ist = s->opaque;
+     VDAContext  *vda = ist->hwaccel_ctx;
+     ist->hwaccel_uninit        = NULL;
+     ist->hwaccel_retrieve_data = NULL;
+     av_frame_free(&vda->tmp_frame);
+     av_vda_default_free(s);
+     av_freep(&ist->hwaccel_ctx);
+ }
+ int vda_init(AVCodecContext *s)
+ {
+     InputStream *ist = s->opaque;
+     int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
+     VDAContext *vda;
+     int ret;
+     vda = av_mallocz(sizeof(*vda));
+     if (!vda)
+         return AVERROR(ENOMEM);
+     ist->hwaccel_ctx           = vda;
+     ist->hwaccel_uninit        = vda_uninit;
+     ist->hwaccel_retrieve_data = vda_retrieve_data;
+     vda->tmp_frame = av_frame_alloc();
+     if (!vda->tmp_frame) {
+         ret = AVERROR(ENOMEM);
+         goto fail;
+     }
+     ret = av_vda_default_init(s);
+     if (ret < 0) {
+         av_log(NULL, loglevel, "Error creating VDA decoder.\n");
+         goto fail;
+     }
+     return 0;
+ fail:
+     vda_uninit(s);
+     return ret;
+ }