static void dec_init(MSFilter *f){ AMediaFormat *format; AMediaCodec *codec = AMediaCodec_createDecoderByType("video/avc"); DecData *d=ms_new0(DecData,1); d->codec = codec; d->sps=NULL; d->pps=NULL; rfc3984_init(&d->unpacker); d->packet_num=0; d->vsize.width=0; d->vsize.height=0; d->bitstream_size=65536; d->avpf_enabled=FALSE; d->bitstream=ms_malloc0(d->bitstream_size); d->buf_allocator = ms_yuv_buf_allocator_new(); ms_average_fps_init(&d->fps, " H264 decoder: FPS: %f"); format = AMediaFormat_new(); AMediaFormat_setString(format,"mime","video/avc"); //Size mandatory for decoder configuration AMediaFormat_setInt32(format,"width",1920); AMediaFormat_setInt32(format,"height",1080); AMediaCodec_configure(codec, format, NULL, NULL, 0); AMediaCodec_start(codec); AMediaFormat_delete(format); f->data=d; }
AndroidReaderContext(MSFilter *f, MSWebCam *cam):filter(f), webcam(cam),frame(0),fps(5){ ms_message("Creating AndroidReaderContext for Android VIDEO capture filter"); ms_mutex_init(&mutex,NULL); androidCamera = 0; previewWindow = 0; rotation = rotationSavedDuringVSize = UNDEFINED_ROTATION; allocator = ms_yuv_buf_allocator_new(); };
static void pixconv_init(MSFilter *f){ PixConvState *s=ms_new0(PixConvState,1); s->allocator = ms_yuv_buf_allocator_new(); s->size.width = MS_VIDEO_SIZE_CIF_W; s->size.height = MS_VIDEO_SIZE_CIF_H; s->in_fmt=MS_YUV420P; s->out_fmt=MS_YUV420P; s->scaler=NULL; f->data=s; }
static void h264_dec_init(MSFilter *f) { VTH264DecCtx *ctx = ms_new0(VTH264DecCtx, 1); ms_queue_init(&ctx->queue); ms_mutex_init(&ctx->mutex, NULL); ctx->pixbuf_allocator = ms_yuv_buf_allocator_new(); rfc3984_init(&ctx->unpacker); ctx->vsize = MS_VIDEO_SIZE_UNKNOWN; ms_average_fps_init(&ctx->fps, "VideoToolboxDecoder: decoding at %ffps"); ctx->first_image = TRUE; ctx->f = f; f->data = ctx; }
static void bb10capture_init(MSFilter *f) { BB10Capture *d = (BB10Capture*) ms_new0(BB10Capture, 1); MSVideoSize def_size; d->rotation = 0; d->camera_openned = FALSE; d->capture_started = FALSE; d->is_front_cam = TRUE; def_size.width = MS_VIDEO_SIZE_QVGA_W; def_size.height = MS_VIDEO_SIZE_QVGA_H; d->framerate = 15.0; d->vsize = def_size; d->camera = CAMERA_UNIT_NONE; d->window_id = NULL; d->window_group = NULL; ms_queue_init(&d->rq); d->yba = ms_yuv_buf_allocator_new(); f->data = d; }
static void test_video_processing_base (bool_t downscaling,bool_t rotate_clock_wise,bool_t flip) { MSVideoSize src_size = { MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H }; MSVideoSize dest_size = src_size; mblk_t * yuv_block2; YuvBuf yuv; int y_bytes_per_row = src_size.width + src_size.width%32 ; uint8_t* y = (uint8_t*)ms_malloc(y_bytes_per_row*src_size.height); /*to allow bloc to work with multiple of 32*/ int crcb_bytes_per_row = src_size.width/2 + (src_size.width/2)%32 ; uint8_t* cbcr = (uint8_t*)ms_malloc(crcb_bytes_per_row*src_size.height); int i,j; MSYuvBufAllocator *yba = ms_yuv_buf_allocator_new(); int factor=downscaling?2:1; int rotation = 0; if (rotate_clock_wise && flip) { ms_fatal("fix you test"); } if (rotate_clock_wise) { rotation = 90; dest_size.height=src_size.width; dest_size.width=src_size.height; } else if (flip) { rotation = 180; } dest_size.height = dest_size.height/factor; dest_size.width=dest_size.width/factor; for (i=0;i<src_size.height*src_size.width;i++) { y[i]=i%256; } for (i=0;i<src_size.height*src_size.width/2;i++) { cbcr[i]=i%256; } yuv_block2 = copy_ycbcrbiplanar_to_true_yuv_with_rotation_and_down_scale_by_2(yba, y ,cbcr ,rotation , dest_size.width , dest_size.height , y_bytes_per_row , crcb_bytes_per_row , 1 , downscaling); BC_ASSERT_FALSE(ms_yuv_buf_init_from_mblk(&yuv, yuv_block2)); BC_ASSERT_EQUAL(dest_size.width,yuv.w, int, "%d"); BC_ASSERT_EQUAL(dest_size.height,yuv.h, int, "%d"); if (rotate_clock_wise) { /*check y*/ for (i=0;i<yuv.h;i++) { for (j=0;j<yuv.w;j++) if (yuv.planes[0][i*yuv.strides[0]+j] != y[(yuv.w-1-j)*factor*y_bytes_per_row+i*factor]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[0][i*yuv.strides[0]+j],i*yuv.strides[0]+j,y[(yuv.w-1-j)*factor*y_bytes_per_row+i*factor]); BC_FAIL("bad y value"); break; } } /*check cb*/ for (i=0;i<yuv.h/2;i++) { for (j=0;j<yuv.w/2;j++) { if (yuv.planes[1][i*yuv.strides[1]+j] != cbcr[(yuv.w/2-1-j)*factor*crcb_bytes_per_row+2*i*factor]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[1][i*yuv.strides[1]+j],i*yuv.strides[1]+j,cbcr[(yuv.w/2-1-j)*factor*crcb_bytes_per_row+2*i*factor]); BC_FAIL("bad cb value"); break; } if (yuv.planes[2][i*yuv.strides[2]+j] != cbcr[(yuv.w/2-1-j)*factor*crcb_bytes_per_row+2*i*factor+1]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[2][i*yuv.strides[2]+j],i*yuv.strides[2]+j,cbcr[(yuv.w/2-1-j)*factor*crcb_bytes_per_row+2*i*factor+1]); BC_FAIL("bad cr value"); break; } } } } else if (flip) { /*check y*/ for (i=0;i<yuv.h;i++) { for (j=0;j<yuv.w;j++) if (yuv.planes[0][i*yuv.strides[0]+j] != y[(yuv.h-1-i)*factor*y_bytes_per_row+(yuv.w-1-j)*factor]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[0][i*yuv.strides[0]+j],i*yuv.strides[0]+j,y[(yuv.h-1-i)*factor*y_bytes_per_row+(yuv.w-1-j)*factor]); BC_FAIL("bad y value"); break; } } for (i=0;i<yuv.h/2;i++) { for (j=0;j<yuv.w/2;j++) { /*check cb*/ if (yuv.planes[1][i*yuv.strides[1]+j] != cbcr[(yuv.h/2-1-i)*factor*crcb_bytes_per_row+2*(yuv.w/2-1-j)*factor]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[1][i*yuv.strides[1]+j],i*yuv.strides[1]+j,cbcr[(yuv.h/2-1-i)*factor*crcb_bytes_per_row+2*(yuv.w/2-1-j)*factor]); BC_FAIL("bad cb value"); break; } /*check cr*/ if (yuv.planes[2][i*yuv.strides[2]+j] != cbcr[(yuv.h/2-1-i)*factor*crcb_bytes_per_row+2*(yuv.w/2-1-j)*factor+1]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[2][i*yuv.strides[2]+j],i*yuv.strides[2]+j,cbcr[(yuv.h/2-1-i)*factor*crcb_bytes_per_row+2*(yuv.w/2-1-j)*factor+1]); BC_FAIL("bad cr value"); break; } } } } else { /*check y*/ for (i=0;i<yuv.h;i++) { for (j=0;j<yuv.w;j++) if (yuv.planes[0][i*yuv.strides[0]+j] != y[i*factor*y_bytes_per_row+j*factor]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[0][i*yuv.strides[0]+j],i*yuv.strides[0]+j,y[i*factor*y_bytes_per_row+j*factor]); BC_FAIL("bad y value"); break; } } for (i=0;i<yuv.h/2;i++) { for (j=0;j<yuv.w/2;j++) { /*check cb*/ if (yuv.planes[1][i*yuv.strides[1]+j] != cbcr[i*factor*crcb_bytes_per_row+2*j*factor]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[1][i*yuv.strides[1]+j],i*yuv.strides[1]+j,cbcr[i*factor*crcb_bytes_per_row+2*j*factor]); BC_FAIL("bad cb value"); break; } /*check cr*/ if (yuv.planes[2][i*yuv.strides[2]+j] != cbcr[i*factor*crcb_bytes_per_row+2*j*factor+1]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[2][i*yuv.strides[2]+j],i*yuv.strides[2]+j,cbcr[i*factor*crcb_bytes_per_row+2*j*factor+1]); BC_FAIL("bad cr value"); break; } } } } freemsg(yuv_block2); ms_free(y); ms_free(cbcr); ms_yuv_buf_allocator_free(yba); }
static void test_video_processing (void) { MSVideoSize src_size = { MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H }; MSVideoSize src_dest = { MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H }; mblk_t * yuv_block2; YuvBuf yuv; int y_bytes_per_row = src_size.width + src_size.width%32 ; uint8_t* y = (uint8_t*)ms_malloc(y_bytes_per_row*src_size.height); /*to allow bloc to work with multiple of 32*/ int crcb_bytes_per_row = src_size.width/2 + (src_size.width/2)%32 ; uint8_t* cbcr = (uint8_t*)ms_malloc(crcb_bytes_per_row*src_size.height); int i,j; MSYuvBufAllocator *yba = ms_yuv_buf_allocator_new(); for (i=0;i<src_size.height*src_size.width;i++) { y[i]=i%256; } for (i=0;i<src_size.height*src_size.width/2;i++) { cbcr[i]=i%256; } yuv_block2 = copy_ycbcrbiplanar_to_true_yuv_with_rotation_and_down_scale_by_2(yba, y ,cbcr ,0 , src_size.width , src_size.height , y_bytes_per_row , crcb_bytes_per_row , 1 , 0); BC_ASSERT_FALSE(ms_yuv_buf_init_from_mblk(&yuv, yuv_block2)); BC_ASSERT_EQUAL(src_dest.width,yuv.w, int, "%d"); BC_ASSERT_EQUAL(src_dest.height,yuv.h, int, "%d"); /*check y*/ for (i=0;i<yuv.h;i++) { for (j=0;j<yuv.w;j++) if (yuv.planes[0][i*yuv.strides[0]+j] != y[i*y_bytes_per_row+j]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[0][i*yuv.strides[0]+j],i*yuv.strides[0]+j,y[i*y_bytes_per_row+j]); BC_FAIL("bad y value"); break; } } /*check cb*/ for (i=0;i<yuv.h/2;i++) { for (j=0;j<yuv.w/2;j++) if (yuv.planes[1][i*yuv.strides[1]+j] != cbcr[i*crcb_bytes_per_row+2*j]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[1][i*yuv.strides[1]+j],i*yuv.strides[1]+j,y[i*crcb_bytes_per_row+2*j]); BC_FAIL("bad cb value"); break; } } /*check cr*/ for (i=0;i<yuv.h/2;i++) { for (j=0;j<yuv.w/2;j++) if (yuv.planes[2][i*yuv.strides[2]+j] != cbcr[i*crcb_bytes_per_row+2*j+1]) { ms_error("Wrong value [%i] at ofset [%i], should be [%i]",yuv.planes[2][i*yuv.strides[2]+j],i*yuv.strides[2]+j,y[i*crcb_bytes_per_row+2*j+1]); BC_FAIL("bad cr value"); break; } } freemsg(yuv_block2); ms_free(y); ms_free(cbcr); ms_yuv_buf_allocator_free(yba); }