diff options
author | jstebbins <[email protected]> | 2014-12-19 19:18:35 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2014-12-19 19:18:35 +0000 |
commit | 4a79916632f646a6654720e313da35f5ad05db39 (patch) | |
tree | c9de97aaa1618b6e45add10d93821f5a303f830d /libhb | |
parent | 83aa999e8f5e76547159c9fc202e109c706a03ac (diff) |
libhb: add hb_image_init to create blank images
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6613 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r-- | libhb/fifo.c | 80 | ||||
-rw-r--r-- | libhb/internal.h | 1 |
2 files changed, 81 insertions, 0 deletions
diff --git a/libhb/fifo.c b/libhb/fifo.c index 5e24adc2a..4f231fb2c 100644 --- a/libhb/fifo.c +++ b/libhb/fifo.c @@ -542,6 +542,11 @@ void hb_buffer_init_planes( hb_buffer_t * b ) const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(b->f.fmt); int p; + if (desc == NULL) + { + return; + } + uint8_t has_plane[4] = {0,}; for( p = 0; p < 4; p++ ) @@ -560,6 +565,10 @@ hb_buffer_t * hb_frame_buffer_init( int pix_fmt, int width, int height ) int p; uint8_t has_plane[4] = {0,}; + if (desc == NULL) + { + return NULL; + } for( p = 0; p < 4; p++ ) { has_plane[desc->comp[p].plane] = 1; @@ -598,6 +607,10 @@ void hb_video_buffer_realloc( hb_buffer_t * buf, int width, int height ) int p; uint8_t has_plane[4] = {0,}; + if (desc == NULL) + { + return; + } for( p = 0; p < 4; p++ ) { has_plane[desc->comp[p].plane] = 1; @@ -714,6 +727,73 @@ void hb_buffer_move_subs( hb_buffer_t * dst, hb_buffer_t * src ) } +hb_image_t * hb_image_init(int pix_fmt, int width, int height) +{ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); + int p; + uint8_t has_plane[4] = {0,}; + + if (desc == NULL) + { + return NULL; + } + for (p = 0; p < 4; p++) + { + has_plane[desc->comp[p].plane] = 1; + } + + int size = 0; + for (p = 0; p < 4; p++) + { + if (has_plane[p]) + { + size += hb_image_stride( pix_fmt, width, p ) * + hb_image_height_stride( pix_fmt, height, p ); + } + } + + hb_image_t *image = calloc(1, sizeof(hb_image_t)); + if (image == NULL) + { + return NULL; + } +#if defined( SYS_DARWIN ) || defined( SYS_FREEBSD ) || defined( SYS_MINGW ) + image->data = malloc(size); +#elif defined( SYS_CYGWIN ) + /* FIXME */ + image->data = malloc(size + 17); +#else + image->data = memalign(16, size); +#endif + if (image->data == NULL) + { + free(image); + return NULL; + } + image->format = pix_fmt; + image->width = width; + image->height = height; + memset(image->data, 0, size); + + uint8_t * plane = image->data; + for (p = 0; p < 4; p++) + { + if (has_plane[p]) + { + image->plane[p].data = plane; + image->plane[p].stride = hb_image_stride(pix_fmt, width, p ); + image->plane[p].height_stride = + hb_image_height_stride(pix_fmt, height, p ); + image->plane[p].width = hb_image_width(pix_fmt, width, p ); + image->plane[p].height = hb_image_height(pix_fmt, height, p ); + image->plane[p].size = + image->plane[p].stride * image->plane[p].height_stride; + plane += image->plane[p].size; + } + } + return image; +} + hb_image_t * hb_buffer_to_image(hb_buffer_t *buf) { hb_image_t *image = calloc(1, sizeof(hb_image_t)); diff --git a/libhb/internal.h b/libhb/internal.h index 7fb266c8c..a45c85add 100644 --- a/libhb/internal.h +++ b/libhb/internal.h @@ -166,6 +166,7 @@ hb_buffer_t * hb_buffer_dup( const hb_buffer_t * src ); int hb_buffer_copy( hb_buffer_t * dst, const hb_buffer_t * src ); void hb_buffer_swap_copy( hb_buffer_t *src, hb_buffer_t *dst ); void hb_buffer_move_subs( hb_buffer_t * dst, hb_buffer_t * src ); +hb_image_t * hb_image_init(int pix_fmt, int width, int height); hb_image_t * hb_buffer_to_image(hb_buffer_t *buf); hb_fifo_t * hb_fifo_init( int capacity, int thresh ); |