static void pixconv_process(MSFilter *f){ mblk_t *im,*om; PixConvState *s=(PixConvState*)f->data; while((im=ms_queue_get(f->inputs[0]))!=NULL){ if (s->in_fmt==s->out_fmt){ om=im; }else{ AVPicture inbuf; avpicture_fill(&inbuf,im->b_rptr,s->in_fmt,s->size.width,s->size.height); om=pixconv_alloc_mblk(s); if (s->sws_ctx==NULL){ s->sws_ctx=sws_getContext(s->size.width,s->size.height, s->in_fmt,s->size.width,s->size.height, s->out_fmt,SWS_FAST_BILINEAR, NULL, NULL, NULL); } if (sws_scale(s->sws_ctx,inbuf.data,inbuf.linesize, 0, 0, s->outbuf.planes, s->outbuf.strides)!=0){ ms_error("MSPixConv: Error in sws_scale()."); } freemsg(im); } if (om!=NULL) ms_queue_put(f->outputs[0],om); } }
static void pixconv_process(MSFilter *f){ mblk_t *im,*om=NULL; PixConvState *s=(PixConvState*)f->data; while((im=ms_queue_get(f->inputs[0]))!=NULL){ if (s->in_fmt==s->out_fmt){ om=im; }else{ MSPicture inbuf; if (ms_picture_init_from_mblk_with_size(&inbuf,im,s->in_fmt,s->size.width,s->size.height)==0){ om=pixconv_alloc_mblk(s); if (s->scaler==NULL){ s->scaler=ms_scaler_create_context(inbuf.w, inbuf.h, s->in_fmt,inbuf.w,inbuf.h, s->out_fmt,MS_SCALER_METHOD_BILINEAR); } if (s->in_fmt==MS_RGB24_REV){ inbuf.planes[0]+=inbuf.strides[0]*(inbuf.h-1); inbuf.strides[0]=-inbuf.strides[0]; } if (ms_scaler_process (s->scaler,inbuf.planes,inbuf.strides, s->outbuf.planes, s->outbuf.strides)<0){ ms_error("MSPixConv: Error in ms_sws_scale()."); } } freemsg(im); } if (om!=NULL) ms_queue_put(f->outputs[0],om); } }