annotate libmpcodecs/ve_nuv.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents ed8f90096c65
children 5f526e8e3988
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
1 #include <stdio.h>
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
2 #include <stdlib.h>
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
3 #include <string.h>
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
4
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
5 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15212
diff changeset
6 #include "mp_msg.h"
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
7
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
8 #include "m_option.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
9
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
10 #include "codec-cfg.h"
22600
3c2b4a866c6a Add explicit location for headers from the stream/ directory.
diego
parents: 22240
diff changeset
11 #include "stream/stream.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
12 #include "libmpdemux/demuxer.h"
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
13 #include "libmpdemux/stheader.h"
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
14
22600
3c2b4a866c6a Add explicit location for headers from the stream/ directory.
diego
parents: 22240
diff changeset
15 #include "stream/stream.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
16 #include "libmpdemux/muxer.h"
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
17
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
18 #include "img_format.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
19 #include "mp_image.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
20 #include "vf.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
21
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
22 #include "libmpdemux/nuppelvideo.h"
22240
43d03ab870b6 Use liblzo2 instead of liblzo1, it's not bigger but faster.
diego
parents: 22239
diff changeset
23 #include <lzo/lzo1x.h>
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
24 #include "native/RTjpegN.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
25
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
26 #define LZO_AL(size) (((size) + (sizeof(long) - 1)) / sizeof(long))
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
27 #define LZO_IN_LEN (1024*1024L)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
28 #define LZO_OUT_LEN (LZO_IN_LEN + LZO_IN_LEN / 64 + 16 + 3)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
29
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
30 //===========================================================================//
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
31
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
32 struct vf_priv_s {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
33 int raw; // Do not use RTjpeg
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
34 int lzo; // Use lzo
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
35 unsigned int l,c,q; // Mjpeg param
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
36 muxer_stream_t* mux;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
37 uint8_t* buffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
38
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
39 int buf_size;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
40 int tbl_wrote;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
41 lzo_byte *zbuffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
42 long __LZO_MMODEL *zmem;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
43 };
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
44 #define mux_v (vf->priv->mux)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
45
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
46 struct vf_priv_s nuv_priv_dflt = {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
47 0, // raw
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
48 1, // lzo
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
49 1,1, // l,c
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
50 255, // q
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
51 NULL,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
52 NULL,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
53 0,0,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
54 NULL,NULL
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
55 };
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
56
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
57 m_option_t nuvopts_conf[]={
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
58 {"raw", &nuv_priv_dflt.raw, CONF_TYPE_FLAG, 0, 0, 1, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
59 {"rtjpeg", &nuv_priv_dflt.raw, CONF_TYPE_FLAG, 0, 1, 0, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
60 {"lzo", &nuv_priv_dflt.lzo, CONF_TYPE_FLAG, 0, 0, 1, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
61 {"nolzo", &nuv_priv_dflt.lzo, CONF_TYPE_FLAG, 0, 1, 0, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
62 {"q", &nuv_priv_dflt.q, CONF_TYPE_INT, M_OPT_RANGE,3,255, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
63 {"l", &nuv_priv_dflt.l, CONF_TYPE_INT, M_OPT_RANGE,0,20, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
64 {"c", &nuv_priv_dflt.c, CONF_TYPE_INT, M_OPT_RANGE,0,20, NULL},
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
65 {NULL, NULL, 0, 0, 0, 0, NULL}
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
66 };
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
67
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
68 //===========================================================================//
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
69
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
70
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
71 static int config(struct vf_instance_s* vf,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
72 int width, int height, int d_width, int d_height,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
73 unsigned int flags, unsigned int outfmt){
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
74
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
75 // We need a buffer wich can holda header and a whole YV12 picture
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
76 // or a RTJpeg table
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
77 vf->priv->buf_size = width*height*3/2+FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
78 if(vf->priv->buf_size < (int)(128*sizeof(long int) + FRAMEHEADERSIZE))
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
79 vf->priv->buf_size = 128*sizeof(long int) + FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
80
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
81 mux_v->bih->biWidth=width;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
82 mux_v->bih->biHeight=height;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
83 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
12061
656a1b45b309 Use aspect from encoder for AVI vprp header
ranma
parents: 9522
diff changeset
84 mux_v->aspect = (float)d_width/d_height;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
85 vf->priv->buffer = realloc(vf->priv->buffer,vf->priv->buf_size);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
86 vf->priv->tbl_wrote = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
87
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
88 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
89 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
90
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
91 static int control(struct vf_instance_s* vf, int request, void* data){
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
92
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
93 return CONTROL_UNKNOWN;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
94 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
95
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
96 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 14896
diff changeset
97 if(fmt==IMGFMT_I420) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
98 return 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
99 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
100
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17487
diff changeset
101 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
102 struct rtframeheader* ench = (struct rtframeheader*)vf->priv->buffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
103 uint8_t* data = vf->priv->buffer + FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
104 uint8_t* zdata = vf->priv->zbuffer + FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
105 int len = 0, zlen = 0,r;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
106
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
107 memset(vf->priv->buffer,0,FRAMEHEADERSIZE); // Reset the header
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
108 if(vf->priv->lzo)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
109 memset(vf->priv->zbuffer,0,FRAMEHEADERSIZE);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
110
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
111 // This has to be don here otherwise tv with sound doesn't work
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
112 if(!vf->priv->tbl_wrote) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
113 RTjpeg_init_compress((long int*)data,mpi->width,mpi->height,vf->priv->q);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
114 RTjpeg_init_mcompress();
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
115
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
116 ench->frametype = 'D'; // compressor data
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
117 ench->comptype = 'R'; // compressor data for RTjpeg
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
118 ench->packetlength = 128*sizeof(long int);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
119
14896
9ddae5897422 Make nuv files work on bigendian (but old nuv files created with mencoder
reimar
parents: 14878
diff changeset
120 le2me_rtframeheader(ench);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
121 mux_v->buffer=vf->priv->buffer;
17487
fa17424b4c7b change muxer_write_chunk() so that pts/dts _could_ be passed from encoder to muxer
michael
parents: 17012
diff changeset
122 muxer_write_chunk(mux_v,FRAMEHEADERSIZE + 128*sizeof(long int), 0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
123 vf->priv->tbl_wrote = 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
124 memset(ench,0,FRAMEHEADERSIZE); // Reset the header
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
125 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
126
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
127 // Raw picture
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
128 if(vf->priv->raw) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
129 len = mpi->width*mpi->height*3/2;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
130 // Try lzo ???
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
131 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
132 r = lzo1x_1_compress(mpi->planes[0],mpi->width*mpi->height*3/2,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
133 zdata,&zlen,vf->priv->zmem);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
134 if(r != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
135 mp_msg(MSGT_VFILTER,MSGL_ERR,"LZO compress error\n");
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
136 zlen = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
137 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
138 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
139
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
140 if(zlen <= 0 || zlen > len) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
141 memcpy(data,mpi->planes[0],len);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
142 ench->comptype = '0';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
143 } else { // Use lzo only if it's littler
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
144 ench = (struct rtframeheader*)vf->priv->zbuffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
145 ench->comptype = '3';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
146 len = zlen;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
147 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
148
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
149 } else { // RTjpeg compression
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
150 len = RTjpeg_mcompressYUV420(data,mpi->planes[0],vf->priv->l,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
151 vf->priv->c);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
152 if(len <= 0) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
153 mp_msg(MSGT_VFILTER,MSGL_ERR,"RTjpeg_mcompressYUV420 error (%d)\n",len);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
154 return 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
155 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
156
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
157 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
158 r = lzo1x_1_compress(data,len,zdata,&zlen,vf->priv->zmem);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
159 if(r != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
160 mp_msg(MSGT_VFILTER,MSGL_ERR,"LZO compress error\n");
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
161 zlen = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
162 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
163 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
164
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
165 if(zlen <= 0 || zlen > len)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
166 ench->comptype = '1';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
167 else {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
168 ench = (struct rtframeheader*)vf->priv->zbuffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
169 ench->comptype = '2';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
170 len = zlen;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
171 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
172
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
173 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
174
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
175 ench->frametype = 'V'; // video frame
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
176 ench->packetlength = len;
14896
9ddae5897422 Make nuv files work on bigendian (but old nuv files created with mencoder
reimar
parents: 14878
diff changeset
177 le2me_rtframeheader(ench);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
178 mux_v->buffer=(void*)ench;
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17487
diff changeset
179 muxer_write_chunk(mux_v, len + FRAMEHEADERSIZE, 0x10, pts, pts);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
180 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
181 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
182
9522
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
183 static void uninit(struct vf_instance_s* vf) {
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
184
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
185 if(vf->priv->buffer)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
186 free(vf->priv->buffer);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
187 if(vf->priv->zbuffer)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
188 free(vf->priv->zbuffer);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
189 if(vf->priv->zmem)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
190 free(vf->priv->zmem);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
191
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
192 }
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
193
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
194 //===========================================================================//
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
195
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
196 static int vf_open(vf_instance_t *vf, char* args){
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
197 vf->config=config;
14878
5723c4b2a2ea fixes for encoding of multiple files
henry
parents: 14549
diff changeset
198 vf->default_caps=VFCAP_CONSTANT;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
199 vf->control=control;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
200 vf->query_format=query_format;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
201 vf->put_image=put_image;
9522
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
202 vf->uninit = uninit;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
203 vf->priv=malloc(sizeof(struct vf_priv_s));
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
204 memcpy(vf->priv, &nuv_priv_dflt,sizeof(struct vf_priv_s));
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
205 vf->priv->mux=(muxer_stream_t*)args;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
206
14549
acf3241be19b Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents: 12061
diff changeset
207 mux_v->bih=calloc(1, sizeof(BITMAPINFOHEADER));
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
208 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
209 mux_v->bih->biWidth=0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
210 mux_v->bih->biHeight=0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
211 mux_v->bih->biPlanes=1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
212 mux_v->bih->biBitCount=12;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
213 mux_v->bih->biCompression = mmioFOURCC('N','U','V','1');
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
214
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
215 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
216 if(lzo_init() != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
217 mp_msg(MSGT_VFILTER,MSGL_WARN,"LZO init failed: no lzo compression\n");
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
218 vf->priv->lzo = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
219 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
220 vf->priv->zbuffer = (lzo_bytep)malloc(FRAMEHEADERSIZE + LZO_OUT_LEN);
18879
cc65a585fdcc rm unnecesary casts from void* - part 3
reynaldo
parents: 17906
diff changeset
221 vf->priv->zmem = malloc(sizeof(long)*LZO_AL(LZO1X_1_MEM_COMPRESS));
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
222 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
223
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
224 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
225 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
226
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
227 vf_info_t ve_info_nuv = {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
228 "nuv encoder",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
229 "nuv",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
230 "Albeu",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
231 "for internal use by mencoder",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
232 vf_open
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
233 };
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
234
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
235 //===========================================================================//