annotate libmpcodecs/ve_nuv.c @ 29516:87897065b7d7

Fix aspect_fit to work correctly when borders need to be added on top and bottom, previous code accidentally compared against screen dimensions, resulting in cropping instead of added borders.
author reimar
date Thu, 27 Aug 2009 12:38:22 +0000
parents 0f1b5b68af32
children bbb6ebec87a0
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
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
22 #include "libavutil/intreadwrite.h"
22240
43d03ab870b6 Use liblzo2 instead of liblzo1, it's not bigger but faster.
diego
parents: 22239
diff changeset
23 #include <lzo/lzo1x.h>
26304
5f526e8e3988 Rename RTJPEG files so that filenames consist of lowercase name only.
diego
parents: 22601
diff changeset
24 #include "native/rtjpegn.h"
9520
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))
28875
8cfb1d6272fe Allocate buffer for lzo compression correctly also for large frame sizes.
reimar
parents: 28874
diff changeset
27 #define LZO_OUT_LEN(in) ((in) + (in) / 64 + 16 + 3)
9520
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}
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28879
diff changeset
65 };
9520
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
28874
3420ff87048e nuv encoder 64 bit fix: avoid using long/sizeof(long)
reimar
parents: 26304
diff changeset
70 #define COMPDATASIZE (128*4)
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
71 #define FRAMEHEADERSIZE 12
28874
3420ff87048e nuv encoder 64 bit fix: avoid using long/sizeof(long)
reimar
parents: 26304
diff changeset
72
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
73 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
74 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
75 unsigned int flags, unsigned int outfmt){
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
76
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
77 // 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
78 // or a RTJpeg table
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
79 vf->priv->buf_size = width*height*3/2+FRAMEHEADERSIZE;
28874
3420ff87048e nuv encoder 64 bit fix: avoid using long/sizeof(long)
reimar
parents: 26304
diff changeset
80 if(vf->priv->buf_size < COMPDATASIZE + FRAMEHEADERSIZE)
3420ff87048e nuv encoder 64 bit fix: avoid using long/sizeof(long)
reimar
parents: 26304
diff changeset
81 vf->priv->buf_size = COMPDATASIZE + FRAMEHEADERSIZE;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
82
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
83 mux_v->bih->biWidth=width;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
84 mux_v->bih->biHeight=height;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
85 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
86 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
87 vf->priv->buffer = realloc(vf->priv->buffer,vf->priv->buf_size);
28875
8cfb1d6272fe Allocate buffer for lzo compression correctly also for large frame sizes.
reimar
parents: 28874
diff changeset
88 if (vf->priv->lzo)
8cfb1d6272fe Allocate buffer for lzo compression correctly also for large frame sizes.
reimar
parents: 28874
diff changeset
89 vf->priv->zbuffer = realloc(vf->priv->zbuffer, FRAMEHEADERSIZE + LZO_OUT_LEN(vf->priv->buf_size));
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
90 vf->priv->tbl_wrote = 0;
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 1;
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 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
96
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
97 return CONTROL_UNKNOWN;
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
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
100 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
101 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
102 return 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
103 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
104
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17487
diff changeset
105 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
106 uint8_t *header = vf->priv->buffer;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
107 uint8_t* data = vf->priv->buffer + FRAMEHEADERSIZE;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
108 uint8_t* zdata = vf->priv->zbuffer + FRAMEHEADERSIZE;
28877
aed9da3c6d0f Fix type of zlen, fixes crashes on 64 bit systems.
reimar
parents: 28876
diff changeset
109 int len = 0, r;
aed9da3c6d0f Fix type of zlen, fixes crashes on 64 bit systems.
reimar
parents: 28876
diff changeset
110 size_t zlen = 0;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
111
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
112 memset(header, 0, FRAMEHEADERSIZE); // Reset the header
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
113 if(vf->priv->lzo)
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
114 memset(vf->priv->zbuffer,0,FRAMEHEADERSIZE);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28879
diff changeset
115
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
116 // This has to be don here otherwise tv with sound doesn't work
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28879
diff changeset
117 if(!vf->priv->tbl_wrote) {
28874
3420ff87048e nuv encoder 64 bit fix: avoid using long/sizeof(long)
reimar
parents: 26304
diff changeset
118 RTjpeg_init_compress((uint32_t *)data,mpi->width,mpi->height,vf->priv->q);
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
119 RTjpeg_init_mcompress();
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
120
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
121 header[0] = 'D'; // frametype: compressor data
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
122 header[1] = 'R'; // comptype: compressor data for RTjpeg
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
123 AV_WL32(header + 8, COMPDATASIZE); // packetlength
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28879
diff changeset
124
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
125 mux_v->buffer=vf->priv->buffer;
28874
3420ff87048e nuv encoder 64 bit fix: avoid using long/sizeof(long)
reimar
parents: 26304
diff changeset
126 muxer_write_chunk(mux_v,FRAMEHEADERSIZE + COMPDATASIZE, 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
127 vf->priv->tbl_wrote = 1;
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
128 memset(header, 0, FRAMEHEADERSIZE); // Reset the header
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
129 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
130
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
131 // Raw picture
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
132 if(vf->priv->raw) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
133 len = mpi->width*mpi->height*3/2;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
134 // Try lzo ???
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
135 if(vf->priv->lzo) {
28876
e08f479da233 Do not calculate the same value twice
reimar
parents: 28875
diff changeset
136 r = lzo1x_1_compress(mpi->planes[0],len,
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
137 zdata,&zlen,vf->priv->zmem);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
138 if(r != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
139 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
140 zlen = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
141 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
142 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
143
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
144 if(zlen <= 0 || zlen > len) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
145 memcpy(data,mpi->planes[0],len);
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
146 header[1] = '0'; // comptype: uncompressed
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
147 } else { // Use lzo only if it's littler
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
148 header = vf->priv->zbuffer;
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
149 header[1] = '3'; //comptype: lzo
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
150 len = zlen;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
151 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
152
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
153 } else { // RTjpeg compression
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
154 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
155 vf->priv->c);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
156 if(len <= 0) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
157 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
158 return 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
159 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
160
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
161 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
162 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
163 if(r != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
164 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
165 zlen = 0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
166 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
167 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
168
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
169 if(zlen <= 0 || zlen > len)
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
170 header[1] = '1'; // comptype: RTjpeg
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
171 else {
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
172 header = vf->priv->zbuffer;
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
173 header[1] = '2'; // comptype: RTjpeg + LZO
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
174 len = zlen;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
175 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
176
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
177 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28879
diff changeset
178
28879
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
179 header[0] = 'V'; // frametype: video frame
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
180 AV_WL32(header + 8, len); // packetlength
fad277267be5 Get rid of nuppelvideo.h and its ugly packed struct and instead write the
reimar
parents: 28877
diff changeset
181 mux_v->buffer = header;
17906
20aca9baf5d8 passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents: 17487
diff changeset
182 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
183 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
184 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
185
9522
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
186 static void uninit(struct vf_instance_s* vf) {
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
187
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
188 if(vf->priv->buffer)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
189 free(vf->priv->buffer);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
190 if(vf->priv->zbuffer)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
191 free(vf->priv->zbuffer);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
192 if(vf->priv->zmem)
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
193 free(vf->priv->zmem);
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
194
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
195 }
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
196
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
197 //===========================================================================//
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
198
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
199 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
200 vf->config=config;
14878
5723c4b2a2ea fixes for encoding of multiple files
henry
parents: 14549
diff changeset
201 vf->default_caps=VFCAP_CONSTANT;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
202 vf->control=control;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
203 vf->query_format=query_format;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
204 vf->put_image=put_image;
9522
cf2324339983 Add missing uninit
albeu
parents: 9520
diff changeset
205 vf->uninit = uninit;
9520
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
206 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
207 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
208 vf->priv->mux=(muxer_stream_t*)args;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28879
diff changeset
209
14549
acf3241be19b Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents: 12061
diff changeset
210 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
211 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
212 mux_v->bih->biWidth=0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
213 mux_v->bih->biHeight=0;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
214 mux_v->bih->biPlanes=1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
215 mux_v->bih->biBitCount=12;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
216 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
217
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
218 if(vf->priv->lzo) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
219 if(lzo_init() != LZO_E_OK) {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
220 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
221 vf->priv->lzo = 0;
28875
8cfb1d6272fe Allocate buffer for lzo compression correctly also for large frame sizes.
reimar
parents: 28874
diff changeset
222 } else
18879
cc65a585fdcc rm unnecesary casts from void* - part 3
reynaldo
parents: 17906
diff changeset
223 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
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 return 1;
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
227 }
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
228
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
229 vf_info_t ve_info_nuv = {
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
230 "nuv encoder",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
231 "nuv",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
232 "Albeu",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
233 "for internal use by mencoder",
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
234 vf_open
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
235 };
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
236
2860f7c9d9ca A new nuppel video encoder. Mainly for RT encoding on slow box.
albeu
parents:
diff changeset
237 //===========================================================================//