refactor(ffmpeg): skip histogram if frame selected

* use availableIndex

* refactor(ffmpeg): skip histogram if frame selected
This commit is contained in:
Adrian Shum 2022-10-13 20:23:15 +08:00 committed by GitHub
parent da15744b3d
commit 17b50dea3c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 8 deletions

View file

@ -351,6 +351,10 @@ static double root_mean_square_error(const int *hist, const double *median, size
return sum_sq_err;
}
void populate_frame(ThumbContext *thumb_ctx, int n, AVFrame *frame) {
thumb_ctx->frames[n].frame = frame;
}
void populate_histogram(ThumbContext *thumb_ctx, int n, AVFrame *frame) {
const AVPixFmtDescriptor *desc = thumb_ctx->desc;
thumb_ctx->frames[n].frame = frame;

View file

@ -93,8 +93,8 @@ func (av *AVContext) ProcessFrames(maxFrames int) (err error) {
func (av *AVContext) SelectFrame(n int) (err error) {
nn := C.int(n)
if av.thumbContext != nil && nn >= av.thumbContext.n {
nn = av.thumbContext.n - 1
if av.thumbContext != nil && nn > av.availableIndex {
nn = av.availableIndex
}
av.selectedIndex = nn
if err = av.ProcessFrames(-1); err != nil {
@ -233,16 +233,23 @@ func incrementDuration(av *AVContext, frame *C.AVFrame, i C.int) {
}
}
func populateHistogram(av *AVContext, frames <-chan *C.AVFrame) <-chan struct{} {
func populateFrames(av *AVContext, frames <-chan *C.AVFrame) <-chan struct{} {
done := make(chan struct{})
var isSelected = av.selectedIndex > -1
go func() {
var n C.int
for frame := range frames {
C.populate_histogram(av.thumbContext, n, frame)
n++
if !isSelected {
for frame := range frames {
C.populate_histogram(av.thumbContext, n, frame)
n++
}
} else {
for frame := range frames {
C.populate_frame(av.thumbContext, n, frame)
n++
}
}
av.thumbContext.n = n
done <- struct{}{}
close(done)
}()
return done
@ -276,7 +283,7 @@ func createThumbContext(av *AVContext, maxFrames C.int) error {
n = av.selectedIndex + 1
}
frames := make(chan *C.AVFrame, n)
done := populateHistogram(av, frames)
done := populateFrames(av, frames)
frames <- frame
if pkt.buf != nil {
C.av_packet_unref(&pkt)

View file

@ -63,6 +63,8 @@ int find_best_frame_index(ThumbContext *thumb_ctx);
AVFrame *select_frame(ThumbContext *thumb_ctx, int i);
void populate_frame(ThumbContext *thumb_ctx, int n, AVFrame *frame);
void populate_histogram(ThumbContext *thumb_ctx, int n, AVFrame *frame);
extern int goPacketRead(void *opaque, uint8_t *buf, int buf_size);