10 #include "img_format.h"
14 //#include "libvo/fastmemcpy.h"
16 #ifdef USE_LIBAVCODEC_SO
17 #include <ffmpeg/avcodec.h>
19 #include "libavcodec/avcodec.h"
22 #if LIBAVCODEC_BUILD < 4641
23 #error we do not support libavcodec prior to build 4641, get the latest libavcodec CVS
26 #if LIBAVCODEC_BUILD < 4645
27 #warning your version of libavcodec is old, u might want to get a newer one
30 #if LIBAVCODEC_BUILD < 4645
31 #define AVFrame AVVideoFrame
32 #define coded_frame coded_picture
35 #if LIBAVCODEC_BUILD < 4684
36 #define FF_QP2LAMBDA 1
39 extern int avcodec_inited
;
42 unsigned char* outbuf
;
44 AVCodecContext
* context
;
50 #define lavc_venc_context (*vf->priv->context)
52 //===========================================================================//
54 static int config(struct vf_instance_s
* vf
,
55 int width
, int height
, int d_width
, int d_height
,
56 unsigned int flags
, unsigned int outfmt
){
57 if(vf_next_query_format(vf
,IMGFMT_MPEGPES
)<=0) return 0;
59 lavc_venc_context
.width
= width
;
60 lavc_venc_context
.height
= height
;
62 #if LIBAVCODEC_BUILD >= 4754
63 if(!lavc_venc_context
.time_base
.num
|| !lavc_venc_context
.time_base
.den
){
65 if(!lavc_venc_context
.frame_rate
){
71 #if LIBAVCODEC_BUILD >= 4754
72 lavc_venc_context
.time_base
= (AVRational
){1001,30000};
74 #if LIBAVCODEC_BUILD >= 4662
75 lavc_venc_context
.frame_rate
= 30000;
76 lavc_venc_context
.frame_rate_base
= 1001;
78 lavc_venc_context
.frame_rate
=29.97*FRAME_RATE_BASE
; // NTSC
85 #if LIBAVCODEC_BUILD >= 4754
86 lavc_venc_context
.time_base
= (AVRational
){1,25};
88 #if LIBAVCODEC_BUILD >= 4662
89 lavc_venc_context
.frame_rate
= 25;
90 lavc_venc_context
.frame_rate_base
= 1;
92 lavc_venc_context
.frame_rate
=25*FRAME_RATE_BASE
; // PAL
96 // lavc_venc_context.frame_rate=vo_fps*FRAME_RATE_BASE; // same as src
100 if(vf
->priv
->outbuf
) free(vf
->priv
->outbuf
);
102 vf
->priv
->outbuf_size
=10000+width
*height
; // must be enough!
103 vf
->priv
->outbuf
= malloc(vf
->priv
->outbuf_size
);
105 if (avcodec_open(&lavc_venc_context
, vf
->priv
->codec
) != 0) {
106 mp_msg(MSGT_MENCODER
,MSGL_ERR
,MSGTR_CantOpenCodec
);
110 if (lavc_venc_context
.codec
->encode
== NULL
) {
111 mp_msg(MSGT_MENCODER
,MSGL_ERR
,"avcodec init failed (ctx->codec->encode == NULL)!\n");
115 return vf_next_config(vf
,width
,height
,d_width
,d_height
,flags
,IMGFMT_MPEGPES
);
118 static int put_image(struct vf_instance_s
* vf
, mp_image_t
*mpi
, double pts
){
121 AVFrame
*pic
= vf
->priv
->pic
;
123 pic
->data
[0]=mpi
->planes
[0];
124 pic
->data
[1]=mpi
->planes
[1];
125 pic
->data
[2]=mpi
->planes
[2];
126 pic
->linesize
[0]=mpi
->stride
[0];
127 pic
->linesize
[1]=mpi
->stride
[1];
128 pic
->linesize
[2]=mpi
->stride
[2];
130 out_size
= avcodec_encode_video(&lavc_venc_context
,
131 vf
->priv
->outbuf
, vf
->priv
->outbuf_size
, pic
);
133 if(out_size
<=0) return 1;
135 dmpi
=vf_get_image(vf
->next
,IMGFMT_MPEGPES
,
136 MP_IMGTYPE_EXPORT
, 0,
139 vf
->priv
->pes
.data
=vf
->priv
->outbuf
;
140 vf
->priv
->pes
.size
=out_size
;
141 vf
->priv
->pes
.id
=0x1E0;
142 vf
->priv
->pes
.timestamp
=-1; // dunno
144 dmpi
->planes
[0]=(unsigned char*)&vf
->priv
->pes
;
146 return vf_next_put_image(vf
,dmpi
, MP_NOPTS_VALUE
);
149 //===========================================================================//
151 static int query_format(struct vf_instance_s
* vf
, unsigned int fmt
){
156 return (vf_next_query_format(vf
,IMGFMT_MPEGPES
) & (~(VFCAP_CSP_SUPPORTED_BY_HW
|VFCAP_ACCEPT_STRIDE
)));
161 static int open(vf_instance_t
*vf
, char* args
){
166 vf
->put_image
=put_image
;
167 vf
->query_format
=query_format
;
168 vf
->priv
=malloc(sizeof(struct vf_priv_s
));
169 memset(vf
->priv
,0,sizeof(struct vf_priv_s
));
171 if (!avcodec_inited
){
173 avcodec_register_all();
177 vf
->priv
->codec
= (AVCodec
*)avcodec_find_encoder_by_name("mpeg1video");
178 if (!vf
->priv
->codec
) {
179 mp_msg(MSGT_MENCODER
,MSGL_ERR
,MSGTR_MissingLAVCcodec
, "mpeg1video");
183 vf
->priv
->context
=avcodec_alloc_context();
184 #if LIBAVCODEC_BUILD >= 4645
185 vf
->priv
->pic
= avcodec_alloc_frame();
187 vf
->priv
->pic
= avcodec_alloc_picture();
190 // TODO: parse args ->
191 if(args
) sscanf(args
, "%d:%f", &p_quality
, &p_fps
);
195 lavc_venc_context
.flags
= CODEC_FLAG_QSCALE
;
196 #if LIBAVCODEC_BUILD >= 4668
197 lavc_venc_context
.global_quality
=
199 vf
->priv
->pic
->quality
= (int)(FF_QP2LAMBDA
* ((p_quality
<1) ? 1 : p_quality
) + 0.5);
201 // fixed bitrate (in kbits)
202 lavc_venc_context
.bit_rate
= 1000*p_quality
;
204 #if LIBAVCODEC_BUILD >= 4754
205 lavc_venc_context
.time_base
.num
= 1000*1001;
206 lavc_venc_context
.time_base
.den
= (p_fps
<1.0) ? 1000*1001*25 : (p_fps
* lavc_venc_context
.time_base
.num
);
208 #if LIBAVCODEC_BUILD >= 4662
209 lavc_venc_context
.frame_rate_base
= 1000*1001;
210 lavc_venc_context
.frame_rate
= (p_fps
<1.0) ? 0 : (p_fps
* lavc_venc_context
.frame_rate_base
);
212 lavc_venc_context
.frame_rate
= (p_fps
<1.0) ? 0 : (p_fps
* FRAME_RATE_BASE
);
215 lavc_venc_context
.gop_size
= 0; // I-only
216 lavc_venc_context
.pix_fmt
= PIX_FMT_YUV420P
;
221 vf_info_t vf_info_lavc
= {
222 "realtime mpeg1 encoding with libavcodec",
230 //===========================================================================//