refactor: FFmpeg 7.1 support (#101)
* feat: FFmpeg 7.1 * test: reset golden * fix encoder * test: update golden files
This commit is contained in:
parent
1b26cf82f8
commit
d01256b982
35 changed files with 73 additions and 65 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue