void avfilter_link_free(AVFilterLink **link) { if (!*link) return; av_frame_free(&(*link)->partial_buf); ff_framequeue_free(&(*link)->fifo); ff_video_frame_pool_uninit((FFVideoFramePool**)&(*link)->video_frame_pool); av_freep(link); }
FFVideoFramePool *ff_video_frame_pool_init(AVBufferRef* (*alloc)(int size), int width, int height, enum AVPixelFormat format, int align) { int i, ret; FFVideoFramePool *pool; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format); if (!desc) return NULL; pool = av_mallocz(sizeof(FFVideoFramePool)); if (!pool) return NULL; pool->width = width; pool->height = height; pool->format = format; pool->align = align; if ((ret = av_image_check_size(width, height, 0, NULL)) < 0) { goto fail; } if (!pool->linesize[0]) { for(i = 1; i <= align; i += i) { ret = av_image_fill_linesizes(pool->linesize, pool->format, FFALIGN(pool->width, i)); if (ret < 0) { goto fail; } if (!(pool->linesize[0] & (pool->align - 1))) break; } for (i = 0; i < 4 && pool->linesize[i]; i++) { pool->linesize[i] = FFALIGN(pool->linesize[i], pool->align); } } for (i = 0; i < 4 && pool->linesize[i]; i++) { int h = FFALIGN(pool->height, 32); if (i == 1 || i == 2) h = FF_CEIL_RSHIFT(h, desc->log2_chroma_h); pool->pools[i] = av_buffer_pool_init(pool->linesize[i] * h + 16 + 16 - 1, alloc); if (!pool->pools[i]) goto fail; } if (desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL) { pool->pools[1] = av_buffer_pool_init(AVPALETTE_SIZE, alloc); if (!pool->pools[1]) goto fail; } return pool; fail: ff_video_frame_pool_uninit(&pool); return NULL; }