~AndroidReaderContext(){ if (frame != 0) { freeb(frame); } ms_yuv_buf_allocator_free(allocator); ms_mutex_destroy(&mutex); };
static void pixconv_uninit(MSFilter *f){ PixConvState *s=(PixConvState*)f->data; if (s->scaler!=NULL){ ms_scaler_context_free(s->scaler); s->scaler=NULL; } ms_yuv_buf_allocator_free(s->allocator); ms_free(s); }
static void h264_dec_uninit(MSFilter *f) { VTH264DecCtx *ctx = (VTH264DecCtx *)f->data; rfc3984_uninit(&ctx->unpacker); if(ctx->session) h264_dec_uninit_decoder(ctx); ms_queue_flush(&ctx->queue); ms_mutex_destroy(&ctx->mutex); ms_yuv_buf_allocator_free(ctx->pixbuf_allocator); ms_free(f->data); }
static void dec_uninit(MSFilter *f){ DecData *d=(DecData*)f->data; rfc3984_uninit(&d->unpacker); AMediaCodec_stop(d->codec); AMediaCodec_delete(d->codec); if (d->sps) freemsg(d->sps); if (d->pps) freemsg(d->pps); ms_free(d->bitstream); ms_yuv_buf_allocator_free(d->buf_allocator); ms_free(d); }
static void bb10capture_uninit(MSFilter *f) { BB10Capture *d = (BB10Capture*) f->data; if (d->capture_started) { bb10capture_stop_capture(d); } bb10capture_close_camera(d); ms_yuv_buf_allocator_free(d->yba); ms_mutex_destroy(&d->mutex); ms_free(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); }