static int x264_cli_pic_alloc_internal( cli_pic_t *pic, int csp, int width, int height, int align ) { memset( pic, 0, sizeof(cli_pic_t) ); int csp_mask = csp & X264_CSP_MASK; if( x264_cli_csp_is_invalid( csp ) ) pic->img.planes = 0; else pic->img.planes = x264_cli_csps[csp_mask].planes; pic->img.csp = csp; pic->img.width = width; pic->img.height = height; for( int i = 0; i < pic->img.planes; i++ ) { int stride = width * x264_cli_csps[csp_mask].width[i]; stride *= x264_cli_csp_depth_factor( csp ); stride = ALIGN( stride, align ); uint64_t size = (uint64_t)(height * x264_cli_csps[csp_mask].height[i]) * stride; pic->img.plane[i] = x264_malloc( size ); if( !pic->img.plane[i] ) return -1; pic->img.stride[i] = stride; } return 0; }
uint64_t x264_cli_pic_plane_size( int csp, int width, int height, int plane ) { int csp_mask = csp & X264_CSP_MASK; if( x264_cli_csp_is_invalid( csp ) || plane < 0 || plane >= x264_cli_csps[csp_mask].planes ) return 0; uint64_t size = (uint64_t)width * height; size *= x264_cli_csps[csp_mask].width[plane] * x264_cli_csps[csp_mask].height[plane]; return size; }
uint64_t x264_cli_pic_size( int csp, int width, int height ) { if( x264_cli_csp_is_invalid( csp ) ) return 0; uint64_t size = 0; int csp_mask = csp & X264_CSP_MASK; for( int i = 0; i < x264_cli_csps[csp_mask].planes; i++ ) size += x264_cli_pic_plane_size( csp, width, height, i ); return size; }
int x264_cli_pic_copy( cli_pic_t *out, cli_pic_t *in ) { int csp = in->img.csp & X264_CSP_MASK; FAIL_IF_ERROR( x264_cli_csp_is_invalid( in->img.csp ), "invalid colorspace arg %d\n", in->img.csp ) FAIL_IF_ERROR( in->img.csp != out->img.csp || in->img.height != out->img.height || in->img.width != out->img.width, "incompatible frame properties\n" ); /* copy data */ out->duration = in->duration; out->pts = in->pts; out->opaque = in->opaque; for( int i = 0; i < out->img.planes; i++ ) { int height = in->img.height * x264_cli_csps[csp].height[i]; int width = in->img.width * x264_cli_csps[csp].width[i]; x264_cli_plane_copy( out->img.plane[i], out->img.stride[i], in->img.plane[i], in->img.stride[i], width, height ); } return 0; }
static int init( hnd_t *handle, cli_vid_filter_t *filter, video_info_t *info, x264_param_t *param, char *opt_string ) { FAIL_IF_ERROR( x264_cli_csp_is_invalid( info->csp ), "invalid csp %d\n", info->csp ); crop_hnd_t *h = calloc( 1, sizeof(crop_hnd_t) ); if( !h ) return -1; h->csp = x264_cli_get_csp( info->csp ); static const char * const optlist[] = { "left", "top", "right", "bottom", NULL }; char **opts = x264_split_options( opt_string, optlist ); if( !opts ) return -1; int err = handle_opts( h, info, opts, optlist ); free( opts ); if( err ) return -1; h->dims[2] = info->width - h->dims[0] - h->dims[2]; h->dims[3] = info->height - h->dims[1] - h->dims[3]; FAIL_IF_ERROR( h->dims[2] <= 0 || h->dims[3] <= 0, "invalid output resolution %dx%d\n", h->dims[2], h->dims[3] ); if( info->width != h->dims[2] || info->height != h->dims[3] ) x264_cli_log( NAME, X264_LOG_INFO, "cropping to %dx%d\n", h->dims[2], h->dims[3] ); else { /* do nothing as the user supplied 0s for all the values */ free( h ); return 0; } /* done initializing, overwrite values */ info->width = h->dims[2]; info->height = h->dims[3]; h->prev_filter = *filter; h->prev_hnd = *handle; *handle = h; *filter = crop_filter; return 0; }
int x264_cli_pic_alloc( cli_pic_t *pic, int csp, int width, int height ) { memset( pic, 0, sizeof(cli_pic_t) ); int csp_mask = csp & X264_CSP_MASK; if( x264_cli_csp_is_invalid( csp ) ) pic->img.planes = 0; else pic->img.planes = x264_cli_csps[csp_mask].planes; pic->img.csp = csp; pic->img.width = width; pic->img.height = height; for( int i = 0; i < pic->img.planes; i++ ) { pic->img.plane[i] = x264_malloc( x264_cli_pic_plane_size( csp, width, height, i ) ); if( !pic->img.plane[i] ) return -1; pic->img.stride[i] = width * x264_cli_csps[csp_mask].width[i]; } return 0; }
int x264_cli_csp_depth_factor( int csp ) { if( x264_cli_csp_is_invalid( csp ) ) return 0; return (csp & X264_CSP_HIGH_DEPTH) ? 2 : 1; }
const x264_cli_csp_t *x264_cli_get_csp( int csp ) { if( x264_cli_csp_is_invalid( csp ) ) return NULL; return x264_cli_csps + (csp&X264_CSP_MASK); }