1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-06-14 22:15:12 +02:00
Files
compat
doc
ffbuild
fftools
libavcodec
libavdevice
libavfilter
tests
x86
Makefile
aeval.c
af_acopy.c
af_acrusher.c
af_adelay.c
af_aecho.c
af_aemphasis.c
af_afade.c
af_afftfilt.c
af_afir.c
af_afir.h
af_aformat.c
af_agate.c
af_alimiter.c
af_amerge.c
af_amix.c
af_anequalizer.c
af_anull.c
af_apad.c
af_aphaser.c
af_apulsator.c
af_aresample.c
af_asetnsamples.c
af_asetrate.c
af_ashowinfo.c
af_astats.c
af_atempo.c
af_biquads.c
af_bs2b.c
af_channelmap.c
af_channelsplit.c
af_chorus.c
af_compand.c
af_compensationdelay.c
af_crossfeed.c
af_crystalizer.c
af_dcshift.c
af_dynaudnorm.c
af_earwax.c
af_extrastereo.c
af_firequalizer.c
af_flanger.c
af_haas.c
af_hdcd.c
af_headphone.c
af_join.c
af_ladspa.c
af_loudnorm.c
af_pan.c
af_replaygain.c
af_resample.c
af_rubberband.c
af_sidechaincompress.c
af_silencedetect.c
af_silenceremove.c
af_sofalizer.c
af_stereotools.c
af_stereowiden.c
af_superequalizer.c
af_surround.c
af_tremolo.c
af_vibrato.c
af_volume.c
af_volume.h
af_volumedetect.c
all_channel_layouts.inc
allfilters.c
asink_anullsink.c
asrc_anoisesrc.c
asrc_anullsrc.c
asrc_flite.c
asrc_sine.c
audio.c
audio.h
avf_abitscope.c
avf_ahistogram.c
avf_aphasemeter.c
avf_avectorscope.c
avf_concat.c
avf_showcqt.c
avf_showcqt.h
avf_showfreqs.c
avf_showspectrum.c
avf_showvolume.c
avf_showwaves.c
avfilter.c
avfilter.h
avfiltergraph.c
avfilterres.rc
bbox.c
bbox.h
blend.h
bufferqueue.h
buffersink.c
buffersink.h
buffersrc.c
buffersrc.h
bwdif.h
colorspacedsp.c
colorspacedsp.h
colorspacedsp_template.c
colorspacedsp_yuv2yuv_template.c
deshake.h
deshake_opencl.c
deshake_opencl.h
deshake_opencl_kernel.h
drawutils.c
drawutils.h
ebur128.c
ebur128.h
f_bench.c
f_drawgraph.c
f_ebur128.c
f_interleave.c
f_loop.c
f_metadata.c
f_perms.c
f_realtime.c
f_reverse.c
f_select.c
f_sendcmd.c
f_sidedata.c
f_streamselect.c
f_zmq.c
fifo.c
filters.h
formats.c
formats.h
framepool.c
framepool.h
framequeue.c
framequeue.h
framesync.c
framesync.h
generate_wave_table.c
generate_wave_table.h
gradfun.h
graphdump.c
graphparser.c
hermite.h
interlace.h
internal.h
lavfutils.c
lavfutils.h
libavfilter.v
limiter.h
log2_tab.c
lswsutils.c
lswsutils.h
maskedmerge.h
motion_estimation.c
motion_estimation.h
opencl_allkernels.c
opencl_allkernels.h
psnr.h
pthread.c
removegrain.h
scale.c
scale.h
setpts.c
settb.c
signature.h
signature_lookup.c
split.c
src_movie.c
ssim.h
stereo3d.h
thread.h
tinterlace.h
transform.c
transform.h
trim.c
unsharp.h
unsharp_opencl.c
unsharp_opencl.h
unsharp_opencl_kernel.h
vaf_spectrumsynth.c
version.h
vf_alphamerge.c
vf_aspect.c
vf_atadenoise.c
vf_avgblur.c
vf_bbox.c
vf_bitplanenoise.c
vf_blackdetect.c
vf_blackframe.c
vf_blend.c
vf_boxblur.c
vf_bwdif.c
vf_chromakey.c
vf_ciescope.c
vf_codecview.c
vf_colorbalance.c
vf_colorchannelmixer.c
vf_colorkey.c
vf_colorlevels.c
vf_colormatrix.c
vf_colorspace.c
vf_convolution.c
vf_convolve.c
vf_copy.c
vf_coreimage.m
vf_cover_rect.c
vf_crop.c
vf_cropdetect.c
vf_curves.c
vf_datascope.c
vf_dctdnoiz.c
vf_deband.c
vf_decimate.c
vf_deflicker.c
vf_deinterlace_qsv.c
vf_deinterlace_vaapi.c
vf_dejudder.c
vf_delogo.c
vf_deshake.c
vf_despill.c
vf_detelecine.c
vf_displace.c
vf_drawbox.c
vf_drawtext.c
vf_edgedetect.c
vf_elbg.c
vf_eq.c
vf_eq.h
vf_extractplanes.c
vf_fade.c
vf_fftfilt.c
vf_field.c
vf_fieldhint.c
vf_fieldmatch.c
vf_fieldorder.c
vf_find_rect.c
vf_floodfill.c
vf_format.c
vf_fps.c
vf_framepack.c
vf_framerate.c
vf_framestep.c
vf_frei0r.c
vf_fspp.c
vf_fspp.h
vf_gblur.c
vf_geq.c
vf_gradfun.c
vf_hflip.c
vf_histeq.c
vf_histogram.c
vf_hqdn3d.c
vf_hqdn3d.h
vf_hqx.c
vf_hue.c
vf_hwdownload.c
vf_hwmap.c
vf_hwupload.c
vf_hwupload_cuda.c
vf_hysteresis.c
vf_idet.c
vf_idet.h
vf_il.c
vf_interlace.c
vf_kerndeint.c
vf_lenscorrection.c
vf_libopencv.c
vf_libvmaf.c
vf_limiter.c
vf_lumakey.c
vf_lut.c
vf_lut2.c
vf_lut3d.c
vf_maskedclamp.c
vf_maskedmerge.c
vf_mcdeint.c
vf_mergeplanes.c
vf_mestimate.c
vf_midequalizer.c
vf_minterpolate.c
vf_mpdecimate.c
vf_neighbor.c
vf_nlmeans.c
vf_nnedi.c
vf_noise.c
vf_noise.h
vf_null.c
vf_ocr.c
vf_overlay.c
vf_owdenoise.c
vf_pad.c
vf_palettegen.c
vf_paletteuse.c
vf_perspective.c
vf_phase.c
vf_pixdesctest.c
vf_pp.c
vf_pp7.c
vf_pp7.h
vf_premultiply.c
vf_pseudocolor.c
vf_psnr.c
vf_pullup.c
vf_pullup.h
vf_qp.c
vf_random.c
vf_readeia608.c
vf_readvitc.c
vf_remap.c
vf_removegrain.c
vf_removelogo.c
vf_repeatfields.c
vf_rotate.c
vf_sab.c
vf_scale.c
vf_scale_cuda.c
vf_scale_cuda.cu
vf_scale_npp.c
vf_scale_qsv.c
vf_scale_vaapi.c
vf_selectivecolor.c
vf_separatefields.c
vf_setfield.c
vf_showinfo.c
vf_showpalette.c
vf_shuffleframes.c
vf_shuffleplanes.c
vf_signalstats.c
vf_signature.c
vf_smartblur.c
vf_spp.c
vf_spp.h
vf_ssim.c
vf_stack.c
vf_stereo3d.c
vf_subtitles.c
vf_super2xsai.c
vf_swaprect.c
vf_swapuv.c
vf_telecine.c
vf_threshold.c
vf_thumbnail.c
vf_thumbnail_cuda.c
vf_thumbnail_cuda.cu
vf_tile.c
vf_tinterlace.c
vf_tonemap.c
vf_transpose.c
vf_unsharp.c
vf_uspp.c
vf_vaguedenoiser.c
vf_vectorscope.c
vf_vflip.c
vf_vidstabdetect.c
vf_vidstabtransform.c
vf_vignette.c
vf_vmafmotion.c
vf_w3fdif.c
vf_waveform.c
vf_weave.c
vf_xbr.c
vf_yadif.c
vf_zoompan.c
vf_zscale.c
video.c
video.h
vidstabutils.c
vidstabutils.h
vmaf_motion.h
vsink_nullsink.c
vsrc_cellauto.c
vsrc_life.c
vsrc_mandelbrot.c
vsrc_mptestsrc.c
vsrc_testsrc.c
w3fdif.h
window_func.h
yadif.h
libavformat
libavresample
libavutil
libpostproc
libswresample
libswscale
presets
tests
tools
.gitattributes
.gitignore
.travis.yml
CONTRIBUTING.md
COPYING.GPLv2
COPYING.GPLv3
COPYING.LGPLv2.1
COPYING.LGPLv3
CREDITS
Changelog
INSTALL.md
LICENSE.md
MAINTAINERS
Makefile
README.md
RELEASE
configure
FFmpeg/libavfilter/framepool.c

297 lines
8.1 KiB
C
Raw Normal View History

/*
* This file is part of FFmpeg.
*
* Copyright (c) 2015 Matthieu Bouron <matthieu.bouron stupeflix.com>
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "framepool.h"
#include "libavutil/avassert.h"
2017-01-03 17:44:07 +01:00
#include "libavutil/avutil.h"
#include "libavutil/buffer.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
#include "libavutil/mem.h"
#include "libavutil/pixfmt.h"
struct FFFramePool {
2017-01-03 17:44:07 +01:00
enum AVMediaType type;
/* video */
int width;
int height;
2017-01-03 17:44:07 +01:00
/* audio */
int planes;
int channels;
int nb_samples;
/* common */
int format;
int align;
int linesize[4];
AVBufferPool *pools[4];
};
FFFramePool *ff_frame_pool_video_init(AVBufferRef* (*alloc)(int size),
int width,
int height,
enum AVPixelFormat format,
int align)
{
int i, ret;
FFFramePool *pool;
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format);
if (!desc)
return NULL;
pool = av_mallocz(sizeof(FFFramePool));
if (!pool)
return NULL;
2017-01-03 17:44:07 +01:00
pool->type = AVMEDIA_TYPE_VIDEO;
pool->width = width;
pool->height = height;
pool->format = format;
pool->align = align;
if ((ret = av_image_check_size2(width, height, INT64_MAX, format, 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 = AV_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_frame_pool_uninit(&pool);
return NULL;
}
2017-01-03 17:44:07 +01:00
FFFramePool *ff_frame_pool_audio_init(AVBufferRef* (*alloc)(int size),
int channels,
int nb_samples,
enum AVSampleFormat format,
int align)
{
int ret, planar;
FFFramePool *pool;
pool = av_mallocz(sizeof(FFFramePool));
if (!pool)
return NULL;
planar = av_sample_fmt_is_planar(format);
pool->type = AVMEDIA_TYPE_AUDIO;
pool->planes = planar ? channels : 1;
pool->channels = channels;
pool->nb_samples = nb_samples;
pool->format = format;
pool->align = align;
ret = av_samples_get_buffer_size(&pool->linesize[0], channels,
nb_samples, format, 0);
if (ret < 0)
goto fail;
pool->pools[0] = av_buffer_pool_init(pool->linesize[0], NULL);
if (!pool->pools[0])
goto fail;
return pool;
fail:
ff_frame_pool_uninit(&pool);
return NULL;
}
int ff_frame_pool_get_video_config(FFFramePool *pool,
int *width,
int *height,
enum AVPixelFormat *format,
int *align)
{
if (!pool)
return AVERROR(EINVAL);
2017-01-03 17:44:07 +01:00
av_assert0(pool->type == AVMEDIA_TYPE_VIDEO);
*width = pool->width;
*height = pool->height;
*format = pool->format;
*align = pool->align;
return 0;
}
2017-01-03 17:44:07 +01:00
int ff_frame_pool_get_audio_config(FFFramePool *pool,
int *channels,
int *nb_samples,
enum AVSampleFormat *format,
int *align)
{
if (!pool)
return AVERROR(EINVAL);
av_assert0(pool->type == AVMEDIA_TYPE_AUDIO);
*channels = pool->channels;
*nb_samples = pool->nb_samples;
*format = pool->format;
*align = pool->align;
return 0;
}
AVFrame *ff_frame_pool_get(FFFramePool *pool)
{
int i;
AVFrame *frame;
const AVPixFmtDescriptor *desc;
frame = av_frame_alloc();
if (!frame) {
return NULL;
}
2017-01-03 17:44:07 +01:00
switch(pool->type) {
case AVMEDIA_TYPE_VIDEO:
desc = av_pix_fmt_desc_get(pool->format);
if (!desc) {
goto fail;
}
frame->width = pool->width;
frame->height = pool->height;
frame->format = pool->format;
for (i = 0; i < 4; i++) {
frame->linesize[i] = pool->linesize[i];
if (!pool->pools[i])
break;
frame->buf[i] = av_buffer_pool_get(pool->pools[i]);
2017-01-03 17:46:24 +01:00
if (!frame->buf[i])
goto fail;
frame->data[i] = frame->buf[i]->data;
}
if (desc->flags & AV_PIX_FMT_FLAG_PAL ||
desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL) {
enum AVPixelFormat format =
pool->format == AV_PIX_FMT_PAL8 ? AV_PIX_FMT_BGR8 : pool->format;
av_assert0(frame->data[1] != NULL);
2017-01-03 17:46:24 +01:00
if (avpriv_set_systematic_pal2((uint32_t *)frame->data[1], format) < 0)
goto fail;
}
frame->extended_data = frame->data;
break;
2017-01-03 17:44:07 +01:00
case AVMEDIA_TYPE_AUDIO:
frame->nb_samples = pool->nb_samples;
frame->channels = pool->channels;
2017-01-03 17:44:07 +01:00
frame->format = pool->format;
frame->linesize[0] = pool->linesize[0];
if (pool->planes > AV_NUM_DATA_POINTERS) {
frame->extended_data = av_mallocz_array(pool->planes,
sizeof(*frame->extended_data));
frame->nb_extended_buf = pool->planes - AV_NUM_DATA_POINTERS;
frame->extended_buf = av_mallocz_array(frame->nb_extended_buf,
sizeof(*frame->extended_buf));
if (!frame->extended_data || !frame->extended_buf)
goto fail;
} else {
frame->extended_data = frame->data;
av_assert0(frame->nb_extended_buf == 0);
}
for (i = 0; i < FFMIN(pool->planes, AV_NUM_DATA_POINTERS); i++) {
frame->buf[i] = av_buffer_pool_get(pool->pools[0]);
if (!frame->buf[i])
goto fail;
frame->extended_data[i] = frame->data[i] = frame->buf[i]->data;
}
for (i = 0; i < frame->nb_extended_buf; i++) {
frame->extended_buf[i] = av_buffer_pool_get(pool->pools[0]);
if (!frame->extended_buf[i])
goto fail;
frame->extended_data[i + AV_NUM_DATA_POINTERS] = frame->extended_buf[i]->data;
}
break;
default:
av_assert0(0);
}
return frame;
fail:
av_frame_free(&frame);
return NULL;
}
void ff_frame_pool_uninit(FFFramePool **pool)
{
int i;
if (!pool || !*pool)
return;
for (i = 0; i < 4; i++) {
av_buffer_pool_uninit(&(*pool)->pools[i]);
}
av_freep(pool);
}