annotate libmpcodecs/ve_nuv.c @ 18049:77a3b0d11ca5

Limit the number of entires to the amount that does fit into the chunk. the function need rewrite as it assumes quite many things that are not guaranteed by the specifications.
author iive
date Thu, 06 Apr 2006 20:04:02 +0000
parents 20aca9baf5d8
children cc65a585fdcc
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"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
11 #include "stream.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
12 #include "demuxer.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
13 #include "stheader.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
14
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
15 #include "muxer.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
16
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
17 #include "img_format.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
18 #include "mp_image.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
19 #include "vf.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
20
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
21 #include "libmpdemux/nuppelvideo.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
22 #include "native/minilzo.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
23 #include "native/RTjpegN.h"
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
24
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
25 #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
26 #define LZO_IN_LEN (1024*1024L)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
27 #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
28
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 struct vf_priv_s {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
32 int raw; // Do not use RTjpeg
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
33 int lzo; // Use lzo
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
34 unsigned int l,c,q; // Mjpeg param
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
35 muxer_stream_t* mux;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
36 uint8_t* buffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
37
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
38 int buf_size;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
39 int tbl_wrote;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
40 lzo_byte *zbuffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
41 long __LZO_MMODEL *zmem;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
42 };
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
43 #define mux_v (vf->priv->mux)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
44
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
45 struct vf_priv_s nuv_priv_dflt = {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
46 0, // raw
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
47 1, // lzo
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
48 1,1, // l,c
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
49 255, // q
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
50 NULL,
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 0,0,
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
53 NULL,NULL
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
54 };
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 m_option_t nuvopts_conf[]={
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
57 {"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
58 {"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
59 {"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
60 {"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
61 {"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
62 {"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
63 {"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
64 {NULL, NULL, 0, 0, 0, 0, NULL}
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
65 };
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 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
71 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
72 unsigned int flags, unsigned int outfmt){
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
73
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
74 // 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
75 // or a RTJpeg table
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
76 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
77 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
78 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
79
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
80 mux_v->bih->biWidth=width;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
81 mux_v->bih->biHeight=height;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
82 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
83 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
84 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
85 vf->priv->tbl_wrote = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
86
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
87 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
88 }
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 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
91
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
92 return CONTROL_UNKNOWN;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
93 }
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 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
96 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
97 return 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
98 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
99
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17487
diff changeset
100 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
101 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
102 uint8_t* data = vf->priv->buffer + FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
103 uint8_t* zdata = vf->priv->zbuffer + FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
104 int len = 0, zlen = 0,r;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
105
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
106 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
107 if(vf->priv->lzo)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
108 memset(vf->priv->zbuffer,0,FRAMEHEADERSIZE);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
109
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
110 // 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
111 if(!vf->priv->tbl_wrote) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
112 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
113 RTjpeg_init_mcompress();
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
114
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
115 ench->frametype = 'D'; // compressor data
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
116 ench->comptype = 'R'; // compressor data for RTjpeg
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
117 ench->packetlength = 128*sizeof(long int);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
118
14896
9ddae5897422 Make nuv files work on bigendian (but old nuv files created with mencoder
reimar
parents: 14878
diff changeset
119 le2me_rtframeheader(ench);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
120 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
121 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
122 vf->priv->tbl_wrote = 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
123 memset(ench,0,FRAMEHEADERSIZE); // Reset the header
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
124 }
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 // Raw picture
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
127 if(vf->priv->raw) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
128 len = mpi->width*mpi->height*3/2;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
129 // Try lzo ???
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
130 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
131 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
132 zdata,&zlen,vf->priv->zmem);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
133 if(r != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
134 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
135 zlen = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
136 }
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 if(zlen <= 0 || zlen > len) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
140 memcpy(data,mpi->planes[0],len);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
141 ench->comptype = '0';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
142 } 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
143 ench = (struct rtframeheader*)vf->priv->zbuffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
144 ench->comptype = '3';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
145 len = zlen;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
146 }
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 } else { // RTjpeg compression
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
149 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
150 vf->priv->c);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
151 if(len <= 0) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
152 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
153 return 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
154 }
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 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
157 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
158 if(r != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
159 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
160 zlen = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
161 }
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 if(zlen <= 0 || zlen > len)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
165 ench->comptype = '1';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
166 else {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
167 ench = (struct rtframeheader*)vf->priv->zbuffer;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
168 ench->comptype = '2';
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
169 len = zlen;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
170 }
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 ench->frametype = 'V'; // video frame
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
175 ench->packetlength = len;
14896
9ddae5897422 Make nuv files work on bigendian (but old nuv files created with mencoder
reimar
parents: 14878
diff changeset
176 le2me_rtframeheader(ench);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
177 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
178 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
179 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
180 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
181
9522
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
182 static void uninit(struct vf_instance_s* vf) {
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
183
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
184 if(vf->priv->buffer)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
185 free(vf->priv->buffer);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
186 if(vf->priv->zbuffer)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
187 free(vf->priv->zbuffer);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
188 if(vf->priv->zmem)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
189 free(vf->priv->zmem);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
190
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
191 }
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
192
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
193 //===========================================================================//
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 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
196 vf->config=config;
14878
5723c4b2a2ea fixes for encoding of multiple files
henry
parents: 14549
diff changeset
197 vf->default_caps=VFCAP_CONSTANT;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
198 vf->control=control;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
199 vf->query_format=query_format;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
200 vf->put_image=put_image;
9522
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
201 vf->uninit = uninit;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
202 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
203 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
204 vf->priv->mux=(muxer_stream_t*)args;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
205
14549
acf3241be19b Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents: 12061
diff changeset
206 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
207 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
208 mux_v->bih->biWidth=0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
209 mux_v->bih->biHeight=0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
210 mux_v->bih->biPlanes=1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
211 mux_v->bih->biBitCount=12;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
212 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
213
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
214 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
215 if(lzo_init() != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
216 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
217 vf->priv->lzo = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
218 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
219 vf->priv->zbuffer = (lzo_bytep)malloc(FRAMEHEADERSIZE + LZO_OUT_LEN);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
220 vf->priv->zmem = (long*)malloc(sizeof(long)*LZO_AL(LZO1X_1_MEM_COMPRESS));
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
221 }
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 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
224 }
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 vf_info_t ve_info_nuv = {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
227 "nuv encoder",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
228 "nuv",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
229 "Albeu",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
230 "for internal use by mencoder",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
231 vf_open
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
232 };
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 //===========================================================================//