refactor: FFmpeg 7.1 support (#101)

* feat: FFmpeg 7.1

* test: reset golden

* fix encoder

* test: update golden files
This commit is contained in:
Adrian Shum 2025-07-21 20:43:26 +08:00 committed by GitHub
parent 1b26cf82f8
commit d01256b982
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 73 additions and 65 deletions

View file

@ -210,23 +210,28 @@ AVFrame *convert_frame_to_rgb(AVFrame *frame, int alpha) {
return output_frame;
}
AVPacket create_packet() {
AVPacket *create_packet() {
AVPacket *pkt = av_packet_alloc();
if (!pkt) {
return NULL;
}
pkt->data = NULL;
pkt->size = 0;
return *pkt;
return pkt;
}
int
obtain_next_frame(AVFormatContext *fmt_ctx, AVCodecContext *dec_ctx, int stream_index, AVPacket *pkt, AVFrame **frame) {
int obtain_next_frame(AVFormatContext *fmt_ctx, AVCodecContext *dec_ctx, int stream_index, AVPacket *pkt, AVFrame **frame) {
int err = 0, retry = 0;
if (!(*frame) && !(*frame = av_frame_alloc())) {
err = AVERROR(ENOMEM);
return err;
}
// Try to receive a frame from the decoder first
if ((err = avcodec_receive_frame(dec_ctx, *frame)) != AVERROR(EAGAIN)) {
return err;
}
while (1) {
if ((err = av_read_frame(fmt_ctx, pkt)) < 0) {
break;
@ -239,6 +244,7 @@ obtain_next_frame(AVFormatContext *fmt_ctx, AVCodecContext *dec_ctx, int stream_
if (retry++ >= 10) {
break;
}
av_packet_unref(pkt);
continue;
}
if (!(*frame) && !(*frame = av_frame_alloc())) {
@ -251,7 +257,7 @@ obtain_next_frame(AVFormatContext *fmt_ctx, AVCodecContext *dec_ctx, int stream_
}
av_packet_unref(pkt);
}
if (pkt->buf) {
if (pkt->data) {
av_packet_unref(pkt);
}
return err;

View file

@ -301,8 +301,13 @@ func populateFrames(av *AVContext, frames <-chan *C.AVFrame) <-chan struct{} {
func createThumbContext(av *AVContext, maxFrames C.int) error {
pkt := C.create_packet()
if pkt == nil {
return avError(C.int(ErrNoMem))
}
defer C.av_packet_free(&pkt)
var frame *C.AVFrame
err := C.obtain_next_frame(av.formatContext, av.codecContext, av.stream.index, &pkt, &frame)
err := C.obtain_next_frame(av.formatContext, av.codecContext, av.stream.index, pkt, &frame)
if err >= 0 {
incrementDuration(av, frame, 0)
av.thumbContext = C.create_thumb_context(av.stream, frame)
@ -311,9 +316,6 @@ func createThumbContext(av *AVContext, maxFrames C.int) error {
}
}
if err < 0 {
if pkt.buf != nil {
C.av_packet_unref(&pkt)
}
if frame != nil {
C.av_frame_free(&frame)
}
@ -332,18 +334,20 @@ func createThumbContext(av *AVContext, maxFrames C.int) error {
frames := make(chan *C.AVFrame, n)
done := populateFrames(av, frames)
frames <- frame
if pkt.buf != nil {
C.av_packet_unref(&pkt)
}
return populateThumbContext(av, frames, n, done)
}
func populateThumbContext(av *AVContext, frames chan *C.AVFrame, n C.int, done <-chan struct{}) error {
pkt := C.create_packet()
if pkt == nil {
return avError(C.int(ErrNoMem))
}
defer C.av_packet_free(&pkt)
var frame *C.AVFrame
var err C.int
for i := C.int(1); i < n; i++ {
err = C.obtain_next_frame(av.formatContext, av.codecContext, av.stream.index, &pkt, &frame)
err = C.obtain_next_frame(av.formatContext, av.codecContext, av.stream.index, pkt, &frame)
if err < 0 {
break
}
@ -362,9 +366,6 @@ func populateThumbContext(av *AVContext, frames chan *C.AVFrame, n C.int, done <
av.selectedIndex = av.availableIndex
}
close(frames)
if pkt.buf != nil {
C.av_packet_unref(&pkt)
}
if frame != nil {
C.av_frame_free(&frame)
}

View file

@ -47,10 +47,9 @@ int create_codec_context(AVStream *video_stream, AVCodecContext **dec_ctx);
AVFrame *convert_frame_to_rgb(AVFrame *frame, int alpha);
AVPacket create_packet();
AVPacket *create_packet();
int
obtain_next_frame(AVFormatContext *fmt_ctx, AVCodecContext *dec_ctx, int stream_index, AVPacket *pkt, AVFrame **frame);
int obtain_next_frame(AVFormatContext *fmt_ctx, AVCodecContext *dec_ctx, int stream_index, AVPacket *pkt, AVFrame **frame);
ThumbContext *create_thumb_context(AVStream *stream, AVFrame *frame);