changeset 11581:6ea42c885d60

RAWYUV output in MEncoder. Patch by Tuukka Toivonen <tuukkat@ee.oulu.fi>
author alex
date Mon, 08 Dec 2003 12:44:11 +0000
parents 90953d955165
children ce9c964c66c3
files DOCS/man/en/mplayer.1 cfg-mencoder.h libmpcodecs/Makefile libmpcodecs/ve.c libmpcodecs/ve_rawyuv.c mencoder.c
diffstat 6 files changed, 91 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Mon Dec 08 12:14:32 2003 +0000
+++ b/DOCS/man/en/mplayer.1	Mon Dec 08 12:44:11 2003 +0000
@@ -3331,6 +3331,8 @@
 encode to DivX4/\:DivX5
 .IPs "\-ovc rawrgb"
 encode to uncompressed RGB24
+.IPs "\-ovc rawyuv"
+encode to uncompressed YUV (I420)
 .IPs "\-ovc lavc"
 encode with a libavcodec codecs
 .RE
--- a/cfg-mencoder.h	Mon Dec 08 12:14:32 2003 +0000
+++ b/cfg-mencoder.h	Mon Dec 08 12:44:11 2003 +0000
@@ -66,6 +66,7 @@
 	{"lavc", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_LIBAVCODEC, NULL},
 //	{"null", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_NULL, NULL},
 	{"rawrgb", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_RAWRGB, NULL},
+	{"rawyuv", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_RAWYUV, NULL},
 	{"vfw", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_VFW, NULL},
 	{"libdv", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_LIBDV, NULL},
 	{"xvid", &out_video_codec, CONF_TYPE_FLAG, 0, 0, VCODEC_XVID, NULL},
@@ -75,6 +76,7 @@
 	"   copy     - frame copy, without re-encoding. doesn't work with filters!\n"
 	"   frameno  - special audio-only file for 3-pass encoding, see DOCS!\n"
 	"   rawrgb   - uncompressed RGB 24bpp video\n"
+	"   rawyuv   - uncompressed 4:2:0 YUV (I420) 12bpp video\n"
 	"   nuv      - nuppel video\n"
 #ifdef HAVE_DIVX4ENCORE
 #ifdef ENCORE_XVID
--- a/libmpcodecs/Makefile	Mon Dec 08 12:14:32 2003 +0000
+++ b/libmpcodecs/Makefile	Mon Dec 08 12:44:11 2003 +0000
@@ -19,7 +19,7 @@
 VFILTER_SRCS += vf_pp.c
 endif
 
-ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_rawrgb.c ve_libdv.c ve_xvid.c ve_xvid4.c ve_qtvideo.c ve_nuv.c
+ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_rawrgb.c ve_rawyuv.c ve_libdv.c ve_xvid.c ve_xvid4.c ve_qtvideo.c ve_nuv.c
 
 NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/fli.c native/minilzo.c native/msvidc.c native/nuppelvideo.c native/qtrle.c native/qtrpza.c native/qtsmc.c native/roqav.c native/xa_gsm.c native/decode144.c native/decode288.c
 
--- a/libmpcodecs/ve.c	Mon Dec 08 12:14:32 2003 +0000
+++ b/libmpcodecs/ve.c	Mon Dec 08 12:44:11 2003 +0000
@@ -13,6 +13,7 @@
 extern vf_info_t ve_info_lavc;
 extern vf_info_t ve_info_vfw;
 extern vf_info_t ve_info_rawrgb;
+extern vf_info_t ve_info_rawyuv;
 extern vf_info_t ve_info_libdv;
 extern vf_info_t ve_info_xvid;
 extern vf_info_t ve_info_qtvideo;
@@ -33,6 +34,7 @@
     &ve_info_libdv,
 #endif
     &ve_info_rawrgb,
+    &ve_info_rawyuv,
 #if defined(HAVE_XVID3) || defined(HAVE_XVID4)
     &ve_info_xvid,
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmpcodecs/ve_rawyuv.c	Mon Dec 08 12:44:11 2003 +0000
@@ -0,0 +1,81 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../config.h"
+#include "../mp_msg.h"
+
+#include "codec-cfg.h"
+#include "stream.h"
+#include "demuxer.h"
+#include "stheader.h"
+
+#include "muxer.h"
+
+#include "img_format.h"
+#include "mp_image.h"
+#include "vf.h"
+
+//===========================================================================//
+
+struct vf_priv_s {
+    muxer_stream_t* mux;
+};
+#define mux_v (vf->priv->mux)
+
+static int config(struct vf_instance_s *vf,
+        int width, int height, int d_width, int d_height,
+	unsigned int flags, unsigned int outfmt)
+{
+    mux_v->bih->biWidth = width;
+    mux_v->bih->biHeight = height;
+    mux_v->bih->biSizeImage = mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
+    return 1;
+}
+
+static int control(struct vf_instance_s *vf, int request, void *data) {
+    return CONTROL_UNKNOWN;
+}
+
+static int query_format(struct vf_instance_s *vf, unsigned int fmt) {
+    if (fmt==IMGFMT_I420) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW;
+    return 0;
+}
+
+static int put_image(struct vf_instance_s *vf, mp_image_t *mpi) {
+    mux_v->buffer = mpi->planes[0];
+    muxer_write_chunk(mux_v, mpi->width*mpi->height*3/2, 0x10);
+    return 1;
+}
+
+//===========================================================================//
+
+static int vf_open(vf_instance_t *vf, char* args){
+    vf->config = config;
+    vf->control = control;
+    vf->query_format = query_format;
+    vf->put_image = put_image;
+    vf->priv = malloc(sizeof(struct vf_priv_s));
+    memset(vf->priv, 0, sizeof(struct vf_priv_s));
+    vf->priv->mux = (muxer_stream_t*)args;
+    
+    mux_v->bih = malloc(sizeof(BITMAPINFOHEADER));
+    mux_v->bih->biSize = sizeof(BITMAPINFOHEADER);
+    mux_v->bih->biWidth = 0;
+    mux_v->bih->biHeight = 0;
+    mux_v->bih->biCompression = mmioFOURCC('I', '4', '2', '0');
+    mux_v->bih->biPlanes = 3;
+    mux_v->bih->biBitCount = 12;
+
+    return 1;
+}
+
+vf_info_t ve_info_rawyuv = {
+    "rawyuv encoder",
+    "rawyuv",
+    "tuukkat@ee.oulu.fi",
+    "Based on rawrgb",
+    vf_open
+};
+
+//===========================================================================//
--- a/mencoder.c	Mon Dec 08 12:14:32 2003 +0000
+++ b/mencoder.c	Mon Dec 08 12:44:11 2003 +0000
@@ -9,6 +9,7 @@
 #define VCODEC_XVID 9
 #define VCODEC_QTVIDEO 10
 #define VCODEC_NUV 11
+#define VCODEC_RAWYUV 12
 
 #define ACODEC_COPY 0
 #define ACODEC_PCM 1
@@ -691,6 +692,8 @@
         sh_video->vfilter=vf_open_encoder(NULL,"lavc",(char *)mux_v); break;
     case VCODEC_RAWRGB:
         sh_video->vfilter=vf_open_encoder(NULL,"rawrgb",(char *)mux_v); break;
+    case VCODEC_RAWYUV:
+        sh_video->vfilter=vf_open_encoder(NULL,"rawyuv",(char *)mux_v); break;
     case VCODEC_VFW:
         sh_video->vfilter=vf_open_encoder(NULL,"vfw",(char *)mux_v); break;
     case VCODEC_LIBDV: