avcodec/codec_internal: Add FFCodec, hide internal part of AVCodec
Up until now, codec.h contains both public and private parts of AVCodec. This exposes the internals of AVCodec to users and leads them into the temptation of actually using them and forces us to forward-declare structures and types that users can't use at all. This commit changes this by adding a new structure FFCodec to codec_internal.h that extends AVCodec, i.e. contains the public AVCodec as first member; the private fields of AVCodec are moved to this structure, leaving codec.h clean. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
a688f3c13c
commit
20f9727018
513 changed files with 5330 additions and 5260 deletions
|
|
@ -188,14 +188,15 @@ static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt)
|
|||
static int decode_bsfs_init(AVCodecContext *avctx)
|
||||
{
|
||||
AVCodecInternal *avci = avctx->internal;
|
||||
const FFCodec *const codec = ffcodec(avctx->codec);
|
||||
int ret;
|
||||
|
||||
if (avci->bsf)
|
||||
return 0;
|
||||
|
||||
ret = av_bsf_list_parse_str(avctx->codec->bsfs, &avci->bsf);
|
||||
ret = av_bsf_list_parse_str(codec->bsfs, &avci->bsf);
|
||||
if (ret < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error parsing decoder bitstream filters '%s': %s\n", avctx->codec->bsfs, av_err2str(ret));
|
||||
av_log(avctx, AV_LOG_ERROR, "Error parsing decoder bitstream filters '%s': %s\n", codec->bsfs, av_err2str(ret));
|
||||
if (ret != AVERROR(ENOMEM))
|
||||
ret = AVERROR_BUG;
|
||||
goto fail;
|
||||
|
|
@ -233,7 +234,7 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
|
||||
if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
|
||||
ret = extract_packet_props(avctx->internal, pkt);
|
||||
if (ret < 0)
|
||||
goto finish;
|
||||
|
|
@ -295,6 +296,7 @@ static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame,
|
|||
{
|
||||
AVCodecInternal *avci = avctx->internal;
|
||||
AVPacket *const pkt = avci->in_pkt;
|
||||
const FFCodec *const codec = ffcodec(avctx->codec);
|
||||
int got_frame, actual_got_frame;
|
||||
int ret;
|
||||
|
||||
|
|
@ -320,9 +322,9 @@ static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame,
|
|||
if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME) {
|
||||
ret = ff_thread_decode_frame(avctx, frame, &got_frame, pkt);
|
||||
} else {
|
||||
ret = avctx->codec->decode(avctx, frame, &got_frame, pkt);
|
||||
ret = codec->decode(avctx, frame, &got_frame, pkt);
|
||||
|
||||
if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_PKT_DTS))
|
||||
if (!(codec->caps_internal & FF_CODEC_CAP_SETS_PKT_DTS))
|
||||
frame->pkt_dts = pkt->dts;
|
||||
if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) {
|
||||
if(!avctx->has_b_frames)
|
||||
|
|
@ -507,7 +509,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||
pkt->size -= consumed;
|
||||
pkt->pts = AV_NOPTS_VALUE;
|
||||
pkt->dts = AV_NOPTS_VALUE;
|
||||
if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
|
||||
if (!(codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
|
||||
avci->last_pkt_props->size -= consumed; // See extract_packet_props() comment.
|
||||
avci->last_pkt_props->pts = AV_NOPTS_VALUE;
|
||||
avci->last_pkt_props->dts = AV_NOPTS_VALUE;
|
||||
|
|
@ -539,12 +541,13 @@ static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
|||
static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
|
||||
{
|
||||
AVCodecInternal *avci = avctx->internal;
|
||||
const FFCodec *const codec = ffcodec(avctx->codec);
|
||||
int ret;
|
||||
|
||||
av_assert0(!frame->buf[0]);
|
||||
|
||||
if (avctx->codec->receive_frame) {
|
||||
ret = avctx->codec->receive_frame(avctx, frame);
|
||||
if (codec->receive_frame) {
|
||||
ret = codec->receive_frame(avctx, frame);
|
||||
if (ret != AVERROR(EAGAIN))
|
||||
av_packet_unref(avci->last_pkt_props);
|
||||
} else
|
||||
|
|
@ -553,7 +556,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
|
|||
if (ret == AVERROR_EOF)
|
||||
avci->draining_done = 1;
|
||||
|
||||
if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) &&
|
||||
if (!(codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) &&
|
||||
IS_EMPTY(avci->last_pkt_props)) {
|
||||
// May fail if the FIFO is empty.
|
||||
av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
|
||||
|
|
@ -859,7 +862,7 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
|
|||
if (avctx->pkt_timebase.num && avpkt->pts != AV_NOPTS_VALUE)
|
||||
sub->pts = av_rescale_q(avpkt->pts,
|
||||
avctx->pkt_timebase, AV_TIME_BASE_Q);
|
||||
ret = avctx->codec->decode(avctx, sub, got_sub_ptr, pkt);
|
||||
ret = ffcodec(avctx->codec)->decode(avctx, sub, got_sub_ptr, pkt);
|
||||
if (pkt == avci->buffer_pkt) // did we recode?
|
||||
av_packet_unref(avci->buffer_pkt);
|
||||
if (ret < 0) {
|
||||
|
|
@ -909,11 +912,11 @@ enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *avctx,
|
|||
|
||||
// If a device was supplied when the codec was opened, assume that the
|
||||
// user wants to use it.
|
||||
if (avctx->hw_device_ctx && avctx->codec->hw_configs) {
|
||||
if (avctx->hw_device_ctx && ffcodec(avctx->codec)->hw_configs) {
|
||||
AVHWDeviceContext *device_ctx =
|
||||
(AVHWDeviceContext*)avctx->hw_device_ctx->data;
|
||||
for (i = 0;; i++) {
|
||||
config = &avctx->codec->hw_configs[i]->public;
|
||||
config = &ffcodec(avctx->codec)->hw_configs[i]->public;
|
||||
if (!config)
|
||||
break;
|
||||
if (!(config->methods &
|
||||
|
|
@ -1025,7 +1028,7 @@ int avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
|
|||
int i, ret;
|
||||
|
||||
for (i = 0;; i++) {
|
||||
hw_config = avctx->codec->hw_configs[i];
|
||||
hw_config = ffcodec(avctx->codec)->hw_configs[i];
|
||||
if (!hw_config)
|
||||
return AVERROR(ENOENT);
|
||||
if (hw_config->public.pix_fmt == hw_pix_fmt)
|
||||
|
|
@ -1169,9 +1172,9 @@ int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
|
|||
break;
|
||||
}
|
||||
|
||||
if (avctx->codec->hw_configs) {
|
||||
if (ffcodec(avctx->codec)->hw_configs) {
|
||||
for (i = 0;; i++) {
|
||||
hw_config = avctx->codec->hw_configs[i];
|
||||
hw_config = ffcodec(avctx->codec)->hw_configs[i];
|
||||
if (!hw_config)
|
||||
break;
|
||||
if (hw_config->public.pix_fmt == user_choice)
|
||||
|
|
@ -1538,7 +1541,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
|
|||
{ AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
|
||||
};
|
||||
|
||||
if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
|
||||
if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
|
||||
frame->pts = pkt->pts;
|
||||
frame->pkt_pos = pkt->pos;
|
||||
frame->pkt_duration = pkt->duration;
|
||||
|
|
@ -1739,7 +1742,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||
|
||||
end:
|
||||
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions &&
|
||||
!(avctx->codec->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)) {
|
||||
!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)) {
|
||||
frame->width = avctx->width;
|
||||
frame->height = avctx->height;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue