annotate libmpcodecs/vf_fame.c @ 9593:e9a2af584986

Add the new -vf option wich is the same as vop in reverse order. Syntax is we decided, so you can give the nomes or not with both vop and vf. vf take precedence over vop.
author albeu
date Sat, 15 Mar 2003 18:01:02 +0000
parents f296ff05bcd0
children 27706a9c2015
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
1 #include <stdio.h>
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
2 #include <stdlib.h>
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
3 #include <string.h>
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
4 #include <inttypes.h>
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
5
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
6 #include "../config.h"
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
7 #include "../mp_msg.h"
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
8
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
9 //#ifdef USE_LIBFAME
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
10
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
11 // 100=best >=80 very good >=50 fast
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
12 #define QUALITY 90
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
13
5607
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
14 #include "img_format.h"
1972c3475d93 mp_image.h and img_format.h moved to libmpcodecs
arpi
parents: 5565
diff changeset
15 #include "mp_image.h"
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
16 #include "vf.h"
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
17
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
18 //#include "../libvo/fastmemcpy.h"
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
19 #include "../libfame/fame.h"
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
20
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
21 struct vf_priv_s {
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
22 unsigned char* outbuf;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
23 int outbuf_size;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
24 fame_parameters_t params;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
25 fame_context_t *ctx;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
26 vo_mpegpes_t pes;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
27 };
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
28
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
29 //===========================================================================//
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
30
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
31 static int config(struct vf_instance_s* vf,
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
32 int width, int height, int d_width, int d_height,
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
33 unsigned int flags, unsigned int outfmt){
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
34 if(vf_next_query_format(vf,IMGFMT_MPEGPES)<=0) return 0;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
35
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
36 vf->priv->params.width=width;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
37 vf->priv->params.height=height;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
38
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
39 vf->priv->outbuf_size=10000+width*height; // must be enough!
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
40 if(vf->priv->outbuf) free(vf->priv->outbuf);
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
41 vf->priv->outbuf = malloc(vf->priv->outbuf_size);
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
42
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
43 fame_init(vf->priv->ctx,&vf->priv->params,vf->priv->outbuf,vf->priv->outbuf_size);
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
44
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
45 return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_MPEGPES);
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
46 }
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
47
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6261
diff changeset
48 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
49 fame_yuv_t yuv;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
50 mp_image_t *dmpi;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
51 int out_size;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
52
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
53 yuv.w=mpi->width;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
54 yuv.h=mpi->height;
6260
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
55 yuv.p=mpi->stride[0];
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
56 yuv.y=mpi->planes[0];
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
57 yuv.u=mpi->planes[1];
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
58 yuv.v=mpi->planes[2];
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
59
6260
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
60 // out_size = fame_encode_frame(vf->priv->ctx, &yuv, NULL);
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
61 fame_start_frame(vf->priv->ctx, &yuv, NULL);
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
62 out_size = fame_encode_slice(vf->priv->ctx);
6261
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
63 fame_end_frame(vf->priv->ctx, NULL);
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
64
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6261
diff changeset
65 if(out_size<=0) return 1;
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
66
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
67 dmpi=vf_get_image(vf->next,IMGFMT_MPEGPES,
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
68 MP_IMGTYPE_EXPORT, 0,
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
69 mpi->w, mpi->h);
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
70
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
71 vf->priv->pes.data=vf->priv->outbuf;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
72 vf->priv->pes.size=out_size;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
73 vf->priv->pes.id=0x1E0;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
74 vf->priv->pes.timestamp=-1; // dunno
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
75
7557
f296ff05bcd0 warning fixes
arpi
parents: 7368
diff changeset
76 dmpi->planes[0]=(void*) &vf->priv->pes;
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
77
7368
a894e99c1e51 changing return type of put_image void->int
arpi
parents: 6261
diff changeset
78 return vf_next_put_image(vf,dmpi);
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
79 }
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
80
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
81 //===========================================================================//
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
82
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
83 static int query_format(struct vf_instance_s* vf, unsigned int fmt){
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
84 switch(fmt){
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
85 case IMGFMT_YV12:
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
86 case IMGFMT_I420:
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
87 case IMGFMT_IYUV:
6260
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
88 // return (vf_next_query_format(vf,IMGFMT_MPEGPES) & (~(VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_ACCEPT_STRIDE)));
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
89 return (vf_next_query_format(vf,IMGFMT_MPEGPES) & (~(VFCAP_CSP_SUPPORTED_BY_HW)));
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
90 }
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
91 return 0;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
92 }
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
93
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
94 static int open(vf_instance_t *vf, char* args){
6261
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
95 int p_quality=0;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
96 float p_fps=0;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
97
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
98 vf->config=config;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
99 vf->put_image=put_image;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
100 vf->query_format=query_format;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
101 vf->priv=malloc(sizeof(struct vf_priv_s));
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
102 memset(vf->priv,0,sizeof(struct vf_priv_s));
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
103
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
104 vf->priv->ctx=fame_open();
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
105 if(!vf->priv->ctx){
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
106 printf("FATAL: cannot open libFAME!\n");
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
107 return 0;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
108 }
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
109
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
110 // TODO: parse args ->
6261
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
111 if(args) sscanf(args, "%d:%f", &p_quality, &p_fps);
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
112
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
113 if(p_quality<=100){
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
114 // fixed quality
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
115 vf->priv->params.quality=p_quality?p_quality:QUALITY;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
116 vf->priv->params.bitrate=0;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
117 } else {
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
118 // fixed bitrate (in kbits)
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
119 vf->priv->params.quality=QUALITY;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
120 vf->priv->params.bitrate=1000*p_quality;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
121 }
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
122
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
123 if(p_fps<1) p_fps=25.0;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
124 if(p_fps == ((int)p_fps)){
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
125 vf->priv->params.frame_rate_num=p_fps;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
126 vf->priv->params.frame_rate_den=1;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
127 } else {
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
128 vf->priv->params.frame_rate_num=p_fps*1001;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
129 vf->priv->params.frame_rate_den=1001;
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
130 }
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
131
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
132 vf->priv->params.coding="I";
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
133 vf->priv->params.slices_per_frame=1;
6261
5b76ba46fc72 fame=quality:fps args support, small fixes for 0.9.0 api
arpi
parents: 6260
diff changeset
134 vf->priv->params.frames_per_sequence=(int)p_fps;
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
135 vf->priv->params.shape_quality=100;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
136 vf->priv->params.search_range=8; // for "IPPP" only
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
137 vf->priv->params.verbose=0;
6260
96b5efcad587 use new api of libfame 0.9.0
arpi
parents: 5876
diff changeset
138 vf->priv->params.profile="mpeg1"; // TODO
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
139
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
140 return 1;
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
141 }
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
142
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
143 vf_info_t vf_info_fame = {
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
144 "realtime mpeg1 encoding with libFAME",
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
145 "fame",
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
146 "A'rpi",
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
147 "",
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 7557
diff changeset
148 open,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 7557
diff changeset
149 NULL
5536
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
150 };
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
151
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
152 //===========================================================================//
3cd118559307 vf_fame added - yv12->mpes converter
arpi
parents:
diff changeset
153 //#endif