Hi,
the attached patch should fix this bug.
--
Anton Khirnov
Index: linphone-3.6.1/mediastreamer2/src/videofilters/nowebcam.c
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/src/videofilters/nowebcam.c 2013-02-20 13:38:36.504652970 +0000
+++ linphone-3.6.1/mediastreamer2/src/videofilters/nowebcam.c 2014-02-26 07:21:49.232963255 +0000
@@ -56,20 +56,25 @@
#ifndef NO_FFMPEG
AVCodecContext av_context;
int got_picture=0;
- AVFrame orig;
+ AVFrame *orig;
mblk_t *ret;
struct SwsContext *sws_ctx;
AVPacket pkt;
MSPicture dest;
- AVCodec *codec=avcodec_find_decoder(CODEC_ID_MJPEG);
+ AVCodec *codec=avcodec_find_decoder(AV_CODEC_ID_MJPEG);
if (codec==NULL){
ms_error("Could not find MJPEG decoder in ffmpeg.");
return NULL;
}
+ orig = av_frame_alloc();
+ if (!orig)
+ return NULL;
+
avcodec_get_context_defaults(&av_context);
if (avcodec_open(&av_context,codec)<0){
+ av_frame_free(&orig);
ms_error("jpeg2yuv: avcodec_open failed");
return NULL;
}
@@ -79,6 +84,7 @@
if (avcodec_decode_video2(&av_context,&orig,&got_picture,&pkt) < 0) {
ms_error("jpeg2yuv: avcodec_decode_video failed");
+ av_frame_free(&orig);
avcodec_close(&av_context);
return NULL;
}
@@ -90,24 +96,27 @@
NULL, NULL, NULL);
if (sws_ctx==NULL) {
ms_error("jpeg2yuv: ms_sws_getContext() failed.");
+ av_frame_free(&orig);
avcodec_close(&av_context);
freemsg(ret);
return NULL;
}
#if LIBSWSCALE_VERSION_INT >= AV_VERSION_INT(0,9,0)
- if (sws_scale(sws_ctx,(const uint8_t* const *)orig.data,orig.linesize,0,av_context.height,dest.planes,dest.strides)<0){
+ if (sws_scale(sws_ctx,(const uint8_t* const *)orig->data,orig->linesize,0,av_context.height,dest.planes,dest.strides)<0){
#else
- if (sws_scale(sws_ctx,(uint8_t**)orig.data,orig.linesize,0,av_context.height,dest.planes,dest.strides)<0){
+ if (sws_scale(sws_ctx,(uint8_t**)orig->data,orig->linesize,0,av_context.height,dest.planes,dest.strides)<0){
#endif
ms_error("jpeg2yuv: ms_sws_scale() failed.");
sws_freeContext(sws_ctx);
avcodec_close(&av_context);
+ av_frame_free(&orig);
freemsg(ret);
return NULL;
}
sws_freeContext(sws_ctx);
avcodec_close(&av_context);
+ av_frame_free(&orig);
return ret;
#elif TARGET_OS_IPHONE
MSPicture dest;
Index: linphone-3.6.1/mediastreamer2/src/videofilters/videoenc.c
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/src/videofilters/videoenc.c 2013-06-14 15:21:26.654950046 +0000
+++ linphone-3.6.1/mediastreamer2/src/videofilters/videoenc.c 2014-02-26 07:47:37.095279237 +0000
@@ -223,19 +223,15 @@
}
static void enc_h263_init(MSFilter *f){
- enc_init(f,CODEC_ID_H263P);
+ enc_init(f,AV_CODEC_ID_H263P);
}
static void enc_mpeg4_init(MSFilter *f){
- enc_init(f,CODEC_ID_MPEG4);
-}
-
-static void enc_snow_init(MSFilter *f){
- enc_init(f,CODEC_ID_SNOW);
+ enc_init(f,AV_CODEC_ID_MPEG4);
}
static void enc_mjpeg_init(MSFilter *f){
- enc_init(f,CODEC_ID_MJPEG);
+ enc_init(f,AV_CODEC_ID_MJPEG);
}
static void prepare(EncState *s){
@@ -243,7 +239,7 @@
const int max_br_vbv=128000;
avcodec_get_context_defaults(c);
- if (s->codec==CODEC_ID_MJPEG)
+ if (s->codec==AV_CODEC_ID_MJPEG)
{
ms_message("Codec bitrate set to %i",c->bit_rate);
c->width = s->vsize.width;
@@ -269,8 +265,7 @@
/* ffmpeg vbv rate control consumes too much cpu above a certain target bitrate.
We don't use it above max_br_vbv */
- if (s->codec!=CODEC_ID_SNOW && s->maxbr<max_br_vbv){
- /*snow does not like 1st pass rate control*/
+ if (s->maxbr<max_br_vbv){
c->rc_max_rate=c->bit_rate;
c->rc_min_rate=0;
c->rc_buffer_size=c->rc_max_rate;
@@ -287,9 +282,6 @@
c->gop_size=(int)s->fps*10; /*emit I frame every 10 seconds*/
c->pix_fmt=PIX_FMT_YUV420P;
s->comp_buf=allocb(c->bit_rate*2,0);
- if (s->codec==CODEC_ID_SNOW){
- c->strict_std_compliance=-2;
- }
ms_message("Codec size set to w=%i/h=%i",c->width, c->height);
@@ -304,7 +296,7 @@
#endif
c->rtp_payload_size = s->mtu/2;
if (s->profile==0){
- s->codec=CODEC_ID_H263;
+ s->codec=AV_CODEC_ID_H263;
}else{
/*
c->flags|=CODEC_FLAG_H263P_UMV;
@@ -313,7 +305,7 @@
c->flags|=CODEC_FLAG_OBMC;
c->flags|=CODEC_FLAG_AC_PRED;
*/
- s->codec=CODEC_ID_H263P;
+ s->codec=AV_CODEC_ID_H263P;
}
}
@@ -331,13 +323,11 @@
EncState *s=(EncState*)f->data;
int error;
prepare(s);
- if (s->codec==CODEC_ID_H263P || s->codec==CODEC_ID_H263)
+ if (s->codec==AV_CODEC_ID_H263P || s->codec==AV_CODEC_ID_H263)
prepare_h263(s);
- else if (s->codec==CODEC_ID_MPEG4)
+ else if (s->codec==AV_CODEC_ID_MPEG4)
prepare_mpeg4(s);
- else if (s->codec==CODEC_ID_SNOW){
- /**/
- }else if (s->codec==CODEC_ID_MJPEG){
+ else if (s->codec==AV_CODEC_ID_MJPEG){
/**/
}else {
ms_error("Unsupported codec id %i",s->codec);
@@ -724,12 +714,12 @@
uint8_t *psc;
uint32_t timestamp=f->ticker->time*90LL;
- if (s->codec==CODEC_ID_MPEG4 || s->codec==CODEC_ID_SNOW)
+ if (s->codec==AV_CODEC_ID_MPEG4)
{
mpeg4_fragment_and_send(f,s,frame,timestamp);
return;
}
- else if (s->codec==CODEC_ID_MJPEG)
+ else if (s->codec==AV_CODEC_ID_MJPEG)
{
mblk_t *lqt=NULL;
mblk_t *cqt=NULL;
@@ -766,8 +756,9 @@
static void process_frame(MSFilter *f, mblk_t *inm){
EncState *s=(EncState*)f->data;
AVFrame pict;
+ AVPacket pkt;
AVCodecContext *c=&s->av_context;
- int error;
+ int error, got_output;
mblk_t *comp_buf=s->comp_buf;
int comp_buf_sz=comp_buf->b_datap->db_lim-comp_buf->b_datap->db_base;
YuvBuf yuv;
@@ -789,23 +780,18 @@
s->req_vfu=FALSE;
}
comp_buf->b_rptr=comp_buf->b_wptr=comp_buf->b_datap->db_base;
- if (s->codec==CODEC_ID_SNOW){
- //prepend picture size
- uint32_t header=((s->vsize.width&0xffff)<<16) | (s->vsize.height&0xffff);
- *(uint32_t*)comp_buf->b_wptr=htonl(header);
- comp_buf->b_wptr+=4;
- comp_buf_sz-=4;
- }
- error=avcodec_encode_video(c, (uint8_t*)comp_buf->b_wptr,comp_buf_sz, &pict);
+ pkt.data = (uint8_t *)comp_buf->b_wptr;
+ pkt.size = comp_buf_sz;
+ error=avcodec_encode_video2(c, &pkt, &pict, &got_output);
- if (error<=0) ms_warning("ms_AVencoder_process: error %i.",error);
- else{
+ if (error<0) ms_warning("ms_AVencoder_process: error %i.",error);
+ else if (got_output) {
s->framenum++;
if (s->framenum==1){
video_starter_first_frame (&s->starter,f->ticker->time);
}
- if (c->coded_frame->pict_type==FF_I_TYPE){
+ if (c->coded_frame->pict_type==AV_PICTURE_TYPE_I){
ms_message("Emitting I-frame");
}
comp_buf->b_wptr+=error;
@@ -837,7 +823,6 @@
static int enc_set_br(MSFilter *f, void *arg){
EncState *s=(EncState*)f->data;
- bool_t snow=s->codec==CODEC_ID_SNOW;
s->maxbr=*(int*)arg;
if (s->av_context.codec!=NULL){
/*when we are processing, apply new settings immediately*/
@@ -847,8 +832,8 @@
ms_filter_unlock(f);
return 0;
}
- if (s->maxbr>=1024000 && s->codec!=CODEC_ID_H263P){
- if (s->codec!=CODEC_ID_H263P){
+ if (s->maxbr>=1024000 && s->codec!=AV_CODEC_ID_H263P){
+ if (s->codec!=AV_CODEC_ID_H263P){
s->vsize.width = MS_VIDEO_SIZE_SVGA_W;
s->vsize.height = MS_VIDEO_SIZE_SVGA_H;
}else{
@@ -857,7 +842,7 @@
}
s->fps=25;
}else if (s->maxbr>=800000 ){
- if (s->codec!=CODEC_ID_H263P){
+ if (s->codec!=AV_CODEC_ID_H263P){
s->vsize.width = MS_VIDEO_SIZE_VGA_W;
s->vsize.height = MS_VIDEO_SIZE_VGA_H;
}else{
@@ -874,7 +859,7 @@
s->vsize.height=MS_VIDEO_SIZE_CIF_H;
s->fps=17;
s->qmin=3;
- }else if (s->maxbr>=170000 && s->codec!=CODEC_ID_H263P && s->codec!=CODEC_ID_H263){
+ }else if (s->maxbr>=170000 && s->codec!=AV_CODEC_ID_H263P && s->codec!=AV_CODEC_ID_H263){
s->vsize.width=MS_VIDEO_SIZE_QVGA_W;
s->vsize.height=MS_VIDEO_SIZE_QVGA_H;
s->fps=15;
@@ -887,8 +872,8 @@
}else if (s->maxbr>=64000){
s->vsize.width=MS_VIDEO_SIZE_QCIF_W;
s->vsize.height=MS_VIDEO_SIZE_QCIF_H;
- s->fps=snow ? 7 : 5;
- s->qmin=snow ? 4 : 5;
+ s->fps=5;
+ s->qmin=5;
}else{
s->vsize.width=MS_VIDEO_SIZE_QCIF_W;
s->vsize.height=MS_VIDEO_SIZE_QCIF_H;
@@ -963,22 +948,6 @@
methods
};
-MSFilterDesc ms_snow_enc_desc={
- MS_SNOW_ENC_ID,
- "MSSnowEnc",
- N_("A video snow encoder using ffmpeg library."),
- MS_FILTER_ENCODER,
- "x-snow",
- 1, /*MS_YUV420P is assumed on this input */
- 1,
- enc_snow_init,
- enc_preprocess,
- enc_process,
- enc_postprocess,
- enc_uninit,
- methods
-};
-
MSFilterDesc ms_mjpeg_enc_desc={
MS_JPEG_ENC_ID,
"MSJpegEnc",
@@ -1045,26 +1014,6 @@
.methods=methods
};
-MSFilterDesc ms_snow_enc_desc={
- .id=MS_SNOW_ENC_ID,
- .name="MSSnowEnc",
- .text=N_("The snow codec is royalty-free and is open-source. \n"
- "It uses innovative techniques that makes it one of most promising video "
- "codec. It is implemented within the ffmpeg project.\n"
- "However it is under development, quite unstable and compatibility with other versions "
- "cannot be guaranteed."),
- .category=MS_FILTER_ENCODER,
- .enc_fmt="x-snow",
- .ninputs=1, /*MS_YUV420P is assumed on this input */
- .noutputs=1,
- .init=enc_snow_init,
- .preprocess=enc_preprocess,
- .process=enc_process,
- .postprocess=enc_postprocess,
- .uninit=enc_uninit,
- .methods=methods
-};
-
MSFilterDesc ms_mjpeg_enc_desc={
.id=MS_JPEG_ENC_ID,
.name="MSMJpegEnc",
@@ -1085,15 +1034,13 @@
void __register_ffmpeg_encoders_if_possible(void){
ms_ffmpeg_check_init();
- if (avcodec_find_encoder(CODEC_ID_MPEG4))
+ if (avcodec_find_encoder(AV_CODEC_ID_MPEG4))
ms_filter_register(&ms_mpeg4_enc_desc);
- if (avcodec_find_encoder(CODEC_ID_H263)){
+ if (avcodec_find_encoder(AV_CODEC_ID_H263)){
ms_filter_register(&ms_h263_enc_desc);
ms_filter_register(&ms_h263_old_enc_desc);
}
- if (avcodec_find_encoder(CODEC_ID_SNOW))
- ms_filter_register(&ms_snow_enc_desc);
- if (avcodec_find_encoder(CODEC_ID_MJPEG))
+ if (avcodec_find_encoder(AV_CODEC_ID_MJPEG))
{
ms_filter_register(&ms_mjpeg_enc_desc);
}
Index: linphone-3.6.1/mediastreamer2/src/videofilters/jpegwriter.c
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/src/videofilters/jpegwriter.c 2013-02-20 13:38:36.504652970 +0000
+++ linphone-3.6.1/mediastreamer2/src/videofilters/jpegwriter.c 2014-02-26 07:43:01.362474399 +0000
@@ -36,9 +36,9 @@
static void jpg_init(MSFilter *f){
JpegWriter *s=ms_new0(JpegWriter,1);
- s->codec=avcodec_find_encoder(CODEC_ID_MJPEG);
+ s->codec=avcodec_find_encoder(AV_CODEC_ID_MJPEG);
if (s->codec==NULL){
- ms_error("Could not find CODEC_ID_MJPEG !");
+ ms_error("Could not find AV_CODEC_ID_MJPEG !");
}
f->data=s;
}
@@ -83,10 +83,9 @@
MSPicture yuvbuf, yuvjpeg;
mblk_t *m=ms_queue_peek_last(f->inputs[0]);
if (ms_yuv_buf_init_from_mblk(&yuvbuf,m)==0){
- int error;
- int comp_buf_sz=msgdsize(m);
- uint8_t *comp_buf=(uint8_t*)alloca(comp_buf_sz);
+ int error, got_output;
AVFrame pict;
+ AVPacket pkt = { 0 };
mblk_t *jpegm;
struct SwsContext *sws_ctx;
@@ -128,16 +127,17 @@
avcodec_get_frame_defaults(&pict);
avpicture_fill((AVPicture*)&pict,(uint8_t*)jpegm->b_rptr,avctx->pix_fmt,avctx->width,avctx->height);
- error=avcodec_encode_video(avctx, (uint8_t*)comp_buf,comp_buf_sz, &pict);
+ error=avcodec_encode_video2(avctx, &pkt, &pict, &got_output);
if (error<0){
ms_error("Could not encode jpeg picture.");
- }else{
- if (fwrite(comp_buf,error,1,s->file)>0){
+ }else if (got_output) {
+ if (fwrite(pkt.data,pkt.size,1,s->file)>0){
ms_message("Snapshot done");
}else{
ms_error("Error writing snapshot.");
}
}
+ av_packet_unref(&pkt);
cleanup(s,avctx);
freemsg(jpegm);
}
Index: linphone-3.6.1/mediastreamer2/src/videofilters/videodec.c
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/src/videofilters/videodec.c 2013-02-20 13:38:36.504652970 +0000
+++ linphone-3.6.1/mediastreamer2/src/videofilters/videodec.c 2014-02-26 07:27:45.029778243 +0000
@@ -44,7 +44,6 @@
uint8_t dci[512];
int dci_size;
uint64_t last_error_reported_time;
- bool_t snow_initialized;
bool_t first_image_decoded;
}DecState;
@@ -59,7 +58,6 @@
s->input=NULL;
s->yuv_msg=NULL;
s->output_pix_fmt=PIX_FMT_YUV420P;
- s->snow_initialized=FALSE;
s->outbuf.w=0;
s->outbuf.h=0;
s->sws_ctx=NULL;
@@ -77,19 +75,15 @@
}
static void dec_h263_init(MSFilter *f){
- dec_init(f,CODEC_ID_H263);
+ dec_init(f,AV_CODEC_ID_H263);
}
static void dec_mpeg4_init(MSFilter *f){
- dec_init(f,CODEC_ID_MPEG4);
+ dec_init(f,AV_CODEC_ID_MPEG4);
}
static void dec_mjpeg_init(MSFilter *f){
- dec_init(f,CODEC_ID_MJPEG);
-}
-
-static void dec_snow_init(MSFilter *f){
- dec_init(f,CODEC_ID_SNOW);
+ dec_init(f,AV_CODEC_ID_MJPEG);
}
static void dec_uninit(MSFilter *f){
@@ -133,14 +127,11 @@
s->first_image_decoded = FALSE;
if (s->av_context.codec==NULL){
- /* we must know picture size before initializing snow decoder*/
- if (s->codec!=CODEC_ID_SNOW){
- error=avcodec_open(&s->av_context, s->av_codec);
- if (error!=0) ms_error("avcodec_open() failed: %i",error);
- if (s->codec==CODEC_ID_MPEG4 && s->dci_size>0){
- s->av_context.extradata=s->dci;
- s->av_context.extradata_size=s->dci_size;
- }
+ error=avcodec_open(&s->av_context, s->av_codec);
+ if (error!=0) ms_error("avcodec_open() failed: %i",error);
+ if (s->codec==AV_CODEC_ID_MPEG4 && s->dci_size>0){
+ s->av_context.extradata=s->dci;
+ s->av_context.extradata_size=s->dci_size;
}
}
}
@@ -218,30 +209,6 @@
return NULL;
}
-static mblk_t * parse_snow_header(DecState *s,mblk_t *inm){
- if (msgdsize(inm) >= 4){
- uint32_t h = ntohl(*(uint32_t*)inm->b_rptr);
- if (!s->snow_initialized){
- int error;
- s->av_context.width=h>>16;
- s->av_context.height=h&0xffff;
- error=avcodec_open(&s->av_context, s->av_codec);
- if (error!=0) ms_error("avcodec_open() failed for snow: %i",error);
- else {
- s->snow_initialized=TRUE;
- ms_message("Snow decoder initialized,size=%ix%i",
- s->av_context.width,
- s->av_context.height);
- }
- }
- inm->b_rptr+=4;
- return inm;
- }else {
- freemsg(inm);
- return NULL;
- }
-}
-
struct jpeghdr {
//unsigned int tspec:8; /* type-specific field */
unsigned int off:32; /* fragment byte offset */
@@ -643,8 +610,7 @@
if (f->desc->id==MS_H263_DEC_ID) inm=skip_rfc2429_header(inm);
else if (f->desc->id==MS_H263_OLD_DEC_ID) inm=skip_rfc2190_header(inm);
- else if (s->codec==CODEC_ID_SNOW && s->input==NULL) inm=parse_snow_header(s,inm);
- else if (s->codec==CODEC_ID_MJPEG && f->desc->id==MS_JPEG_DEC_ID) inm=read_rfc2435_header(s,inm);
+ else if (s->codec==AV_CODEC_ID_MJPEG && f->desc->id==MS_JPEG_DEC_ID) inm=read_rfc2435_header(s,inm);
if (inm){
/* accumulate the video packet until we have the rtp markbit*/
@@ -807,22 +773,6 @@
methods
};
-MSFilterDesc ms_snow_dec_desc={
- MS_SNOW_DEC_ID,
- "MSSnowDec",
- N_("A snow decoder using ffmpeg library"),
- MS_FILTER_DECODER,
- "snow",
- 1,
- 1,
- dec_snow_init,
- dec_preprocess,
- dec_process,
- dec_postprocess,
- dec_uninit,
- methods
-};
-
#else
MSFilterDesc ms_h263_dec_desc={
@@ -906,28 +856,11 @@
.methods= methods
};
-MSFilterDesc ms_snow_dec_desc={
- .id=MS_SNOW_DEC_ID,
- .name="MSSnowDec",
- .text="A snow decoder using ffmpeg library",
- .category=MS_FILTER_DECODER,
- .enc_fmt="x-snow",
- .ninputs=1,
- .noutputs=1,
- .init=dec_snow_init,
- .preprocess=dec_preprocess,
- .process=dec_process,
- .postprocess=dec_postprocess,
- .uninit=dec_uninit,
- .methods= methods
-};
-
#endif
MS_FILTER_DESC_EXPORT(ms_mpeg4_dec_desc)
MS_FILTER_DESC_EXPORT(ms_h263_dec_desc)
MS_FILTER_DESC_EXPORT(ms_h263_old_dec_desc)
-MS_FILTER_DESC_EXPORT(ms_snow_dec_desc)
/* decode JPEG image with RTP/jpeg headers */
MS_FILTER_DESC_EXPORT(ms_jpeg_dec_desc)
Index: linphone-3.6.1/mediastreamer2/src/videofilters/h264dec.c
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/src/videofilters/h264dec.c 2013-02-20 13:38:36.476638972 +0000
+++ linphone-3.6.1/mediastreamer2/src/videofilters/h264dec.c 2014-02-26 07:28:18.578609351 +0000
@@ -56,7 +56,7 @@
static void dec_open(DecData *d){
AVCodec *codec;
int error;
- codec=avcodec_find_decoder(CODEC_ID_H264);
+ codec=avcodec_find_decoder(AV_CODEC_ID_H264);
if (codec==NULL) ms_fatal("Could not find H264 decoder in ffmpeg.");
avcodec_get_context_defaults(&d->av_context);
error=avcodec_open(&d->av_context,codec);
Index: linphone-3.6.1/mediastreamer2/build/iphone/voipdescs.h
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/build/iphone/voipdescs.h 2014-02-26 07:29:46.975799162 +0000
+++ linphone-3.6.1/mediastreamer2/build/iphone/voipdescs.h 2014-02-26 07:29:56.918045450 +0000
@@ -26,7 +26,6 @@
extern MSFilterDesc ms_mpeg4_dec_desc;
extern MSFilterDesc ms_h263_dec_desc;
extern MSFilterDesc ms_h263_old_dec_desc;
-extern MSFilterDesc ms_snow_dec_desc;
extern MSFilterDesc ms_jpeg_dec_desc;
extern MSFilterDesc ms_mjpeg_dec_desc;
extern MSFilterDesc ms_pix_conv_desc;
@@ -76,7 +75,6 @@
&ms_mpeg4_dec_desc,
&ms_h263_dec_desc,
&ms_h263_old_dec_desc,
-&ms_snow_dec_desc,
&ms_jpeg_dec_desc,
&ms_mjpeg_dec_desc,
&ms_pix_conv_desc,
Index: linphone-3.6.1/mediastreamer2/build/win32native/voipdescs.h
===================================================================
--- linphone-3.6.1.orig/mediastreamer2/build/win32native/voipdescs.h 2012-09-12 09:34:36.000000000 +0000
+++ linphone-3.6.1/mediastreamer2/build/win32native/voipdescs.h 2014-02-26 07:30:21.330650191 +0000
@@ -24,8 +24,6 @@
extern MSFilterDesc ms_mpeg4_enc_desc;
extern MSFilterDesc ms_mpeg4_dec_desc;
extern MSFilterDesc ms_h264_dec_desc;
-extern MSFilterDesc ms_snow_enc_desc;
-extern MSFilterDesc ms_snow_dec_desc;
extern MSFilterDesc ms_theora_enc_desc;
extern MSFilterDesc ms_theora_dec_desc;
extern MSFilterDesc ms_mjpeg_enc_desc;
@@ -73,8 +71,6 @@
&ms_mpeg4_enc_desc,
&ms_mpeg4_dec_desc,
&ms_h264_dec_desc,
-&ms_snow_enc_desc,
-&ms_snow_dec_desc,
&ms_theora_enc_desc,
&ms_theora_dec_desc,
&ms_mjpeg_enc_desc,