Unified · Split
| @@ -57,6 +57,8 @@ FFFramePool *ff_frame_pool_video_init(AVBufferRef* (*alloc)(size_t size), · 56 unmodified lines | ||
| 57 | 57 | int i, ret; |
| 58 | 58 | FFFramePool *pool; |
| 59 | 59 | const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format); |
| 60 | + ptrdiff_t linesizes[4]; | |
| 61 | + size_t sizes[4]; | |
| 60 | 62 | |
| 61 | 63 | if (!desc) |
| 62 | 64 | return NULL; |
| @@ -89,13 +91,19 @@ FFFramePool *ff_frame_pool_video_init(AVBufferRef* (*alloc)(size_t size), · 26 unmodified lines | ||
| 89 | 91 | } |
| 90 | 92 | } |
| 91 | 93 | |
| 92 | − for (i = 0; i < 4 && pool->linesize[i]; i++) { | |
| 93 | − int h = pool->height; | |
| 94 | − if (i == 1 || i == 2) | |
| 95 | − h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h); | |
| 94 | + for (i = 0; i < 4; i++) | |
| 95 | + linesizes[i] = pool->linesize[i]; | |
| 96 | 96 | |
| 97 | − pool->pools[i] = av_buffer_pool_init(pool->linesize[i] * h + align, | |
| 98 | − alloc); | |
| 97 | + if (av_image_fill_plane_sizes(sizes, pool->format, | |
| 98 | + pool->height, | |
| 99 | + linesizes) < 0) { | |
| 100 | + goto fail; | |
| 101 | + } | |
| 102 | + | |
| 103 | + for (i = 0; i < 4 && sizes[i]; i++) { | |
| 104 | + if (sizes[i] > SIZE_MAX - align) | |
| 105 | + goto fail; | |
| 106 | + pool->pools[i] = av_buffer_pool_init(sizes[i] + align, alloc); | |
| 99 | 107 | if (!pool->pools[i]) |
| 100 | 108 | goto fail; |
| 101 | 109 | } |