1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/mfenc: propagate error codes properly

This commit is contained in:
Dash Santosh
2025-07-28 11:04:19 -07:00
committed by dwbuiten
parent bd18a6a9e0
commit 1e5488951b

View File

@ -296,7 +296,7 @@ static int mf_sample_to_avpacket(AVCodecContext *avctx, IMFSample *sample, AVPac
return 0; return 0;
} }
static IMFSample *mf_a_avframe_to_sample(AVCodecContext *avctx, const AVFrame *frame) static int mf_a_avframe_to_sample(AVCodecContext *avctx, const AVFrame *frame, IMFSample **out_sample)
{ {
MFContext *c = avctx->priv_data; MFContext *c = avctx->priv_data;
size_t len; size_t len;
@ -308,9 +308,13 @@ static IMFSample *mf_a_avframe_to_sample(AVCodecContext *avctx, const AVFrame *f
sample = ff_create_memory_sample(&c->functions, frame->data[0], len, sample = ff_create_memory_sample(&c->functions, frame->data[0], len,
c->in_info.cbAlignment); c->in_info.cbAlignment);
if (sample) if (!sample)
IMFSample_SetSampleDuration(sample, mf_to_mf_time(avctx, frame->nb_samples)); return AVERROR(ENOMEM);
return sample;
IMFSample_SetSampleDuration(sample, mf_to_mf_time(avctx, frame->nb_samples));
*out_sample = sample;
return 0;
} }
static int initialize_dxgi_manager(AVCodecContext *avctx) static int initialize_dxgi_manager(AVCodecContext *avctx)
@ -407,7 +411,7 @@ static int process_software_frame(AVCodecContext *avctx, const AVFrame *frame, I
size = av_image_get_buffer_size(avctx->pix_fmt, avctx->width, avctx->height, 1); size = av_image_get_buffer_size(avctx->pix_fmt, avctx->width, avctx->height, 1);
if (size < 0) if (size < 0)
return AVERROR_EXTERNAL; return size;
sample = ff_create_memory_sample(&c->functions, NULL, size, sample = ff_create_memory_sample(&c->functions, NULL, size,
c->in_info.cbAlignment); c->in_info.cbAlignment);
@ -434,7 +438,7 @@ static int process_software_frame(AVCodecContext *avctx, const AVFrame *frame, I
IMFMediaBuffer_Release(buffer); IMFMediaBuffer_Release(buffer);
if (ret < 0) { if (ret < 0) {
IMFSample_Release(sample); IMFSample_Release(sample);
return AVERROR_EXTERNAL; return ret;
} }
IMFSample_SetSampleDuration(sample, mf_to_mf_time(avctx, frame->duration)); IMFSample_SetSampleDuration(sample, mf_to_mf_time(avctx, frame->duration));
@ -443,7 +447,7 @@ static int process_software_frame(AVCodecContext *avctx, const AVFrame *frame, I
return 0; return 0;
} }
static IMFSample *mf_v_avframe_to_sample(AVCodecContext *avctx, const AVFrame *frame) static int mf_v_avframe_to_sample(AVCodecContext *avctx, const AVFrame *frame, IMFSample **out_sample)
{ {
MFContext *c = avctx->priv_data; MFContext *c = avctx->priv_data;
MFFunctions *func = &c->functions; MFFunctions *func = &c->functions;
@ -456,13 +460,13 @@ static IMFSample *mf_v_avframe_to_sample(AVCodecContext *avctx, const AVFrame *f
// Handle D3D11 hardware frames // Handle D3D11 hardware frames
ret = process_d3d11_frame(avctx, frame, &sample); ret = process_d3d11_frame(avctx, frame, &sample);
if (ret < 0) { if (ret < 0) {
return NULL; return ret;
} }
} else { } else {
// Handle software frames // Handle software frames
ret = process_software_frame(avctx, frame, &sample); ret = process_software_frame(avctx, frame, &sample);
if (ret < 0) { if (ret < 0) {
return NULL; return ret;
} }
} }
@ -472,24 +476,28 @@ static IMFSample *mf_v_avframe_to_sample(AVCodecContext *avctx, const AVFrame *f
av_log(avctx, AV_LOG_WARNING, "Failed to set sample duration: %s\n", ff_hr_str(hr)); av_log(avctx, AV_LOG_WARNING, "Failed to set sample duration: %s\n", ff_hr_str(hr));
} }
return sample; *out_sample = sample;
return 0;
} }
static IMFSample *mf_avframe_to_sample(AVCodecContext *avctx, const AVFrame *frame) static int mf_avframe_to_sample(AVCodecContext *avctx, const AVFrame *frame, IMFSample **out_sample)
{ {
MFContext *c = avctx->priv_data; MFContext *c = avctx->priv_data;
IMFSample *sample; IMFSample *sample;
int ret;
if (c->is_audio) { if (c->is_audio) {
sample = mf_a_avframe_to_sample(avctx, frame); ret = mf_a_avframe_to_sample(avctx, frame, &sample);
} else { } else {
sample = mf_v_avframe_to_sample(avctx, frame); ret = mf_v_avframe_to_sample(avctx, frame, &sample);
} }
if (sample) if (ret < 0)
mf_sample_set_pts(avctx, sample, frame->pts); return ret;
return sample; mf_sample_set_pts(avctx, sample, frame->pts);
*out_sample = sample;
return 0;
} }
static int mf_send_sample(AVCodecContext *avctx, IMFSample *sample) static int mf_send_sample(AVCodecContext *avctx, IMFSample *sample)
@ -625,10 +633,10 @@ static int mf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
} }
if (c->frame->buf[0]) { if (c->frame->buf[0]) {
sample = mf_avframe_to_sample(avctx, c->frame); ret = mf_avframe_to_sample(avctx, c->frame, &sample);
if (!sample) { if (ret < 0) {
av_frame_unref(c->frame); av_frame_unref(c->frame);
return AVERROR(ENOMEM); return ret;
} }
if (c->is_video && c->codec_api) { if (c->is_video && c->codec_api) {
if (c->frame->pict_type == AV_PICTURE_TYPE_I || !c->sample_sent) if (c->frame->pict_type == AV_PICTURE_TYPE_I || !c->sample_sent)