Message ID | 20210224100402.22300-3-anton@khirnov.net |
---|---|
State | Accepted |
Commit | f942e1488400e94bfc2aeb38a413a9056c2f4b0d |
Headers | show |
Series | [FFmpeg-devel,1/5] tests/api-band-test: simplify code | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
On 2/24/2021 7:04 AM, Anton Khirnov wrote: > --- > tests/api/api-flac-test.c | 40 +++++++++++++++++++++++++-------------- > 1 file changed, 26 insertions(+), 14 deletions(-) > > diff --git a/tests/api/api-flac-test.c b/tests/api/api-flac-test.c > index 7c96a4d99e..3d83c56987 100644 > --- a/tests/api/api-flac-test.c > +++ b/tests/api/api-flac-test.c > @@ -113,7 +113,6 @@ static int run_test(AVCodec *enc, AVCodec *dec, AVCodecContext *enc_ctx, > uint8_t *raw_in = NULL, *raw_out = NULL; > int in_offset = 0, out_offset = 0; > int result = 0; > - int got_output = 0; > int i = 0; > int in_frame_bytes, out_frame_bytes; > > @@ -167,25 +166,40 @@ static int run_test(AVCodec *enc, AVCodec *dec, AVCodecContext *enc_ctx, > } > memcpy(raw_in + in_offset, in_frame->data[0], in_frame_bytes); > in_offset += in_frame_bytes; > - result = avcodec_encode_audio2(enc_ctx, &enc_pkt, in_frame, &got_output); > + result = avcodec_send_frame(enc_ctx, in_frame); > if (result < 0) { > - av_log(NULL, AV_LOG_ERROR, "Error encoding audio frame\n"); > + av_log(NULL, AV_LOG_ERROR, "Error submitting a frame for encoding\n"); > return result; > } > > - /* if we get an encoded packet, feed it straight to the decoder */ > - if (got_output) { > - result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt); > + while (result >= 0) { > + result = avcodec_receive_packet(enc_ctx, &enc_pkt); > + if (result == AVERROR(EAGAIN)) > + break; > + else if (result < 0 && result != AVERROR_EOF) { > + av_log(NULL, AV_LOG_ERROR, "Error encoding audio frame\n"); > + return result; > + } > + > + /* if we get an encoded packet, feed it straight to the decoder */ > + result = avcodec_send_packet(dec_ctx, &enc_pkt); > + av_packet_unref(&enc_pkt); > if (result < 0) { > - av_log(NULL, AV_LOG_ERROR, "Error decoding audio packet\n"); > + av_log(NULL, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); > return result; > } > > - if (got_output) { > - if (result != enc_pkt.size) { > - av_log(NULL, AV_LOG_INFO, "Decoder consumed only part of a packet, it is allowed to do so -- need to update this test\n"); > - return AVERROR_UNKNOWN; > - } > + result = avcodec_receive_frame(dec_ctx, out_frame); > + if (result == AVERROR(EAGAIN)) { > + result = 0; > + continue; > + } else if (result == AVERROR(EOF)) { > + result = 0; > + break; > + } else if (result < 0) { > + av_log(NULL, AV_LOG_ERROR, "Error decoding audio packet\n"); > + return result; > + } > > if (in_frame->nb_samples != out_frame->nb_samples) { > av_log(NULL, AV_LOG_ERROR, "Error frames before and after decoding has different number of samples\n"); > @@ -208,9 +222,7 @@ static int run_test(AVCodec *enc, AVCodec *dec, AVCodecContext *enc_ctx, > } > memcpy(raw_out + out_offset, out_frame->data[0], out_frame_bytes); > out_offset += out_frame_bytes; > - } > } > - av_packet_unref(&enc_pkt); > } > > if (memcmp(raw_in, raw_out, out_frame_bytes * NUMBER_OF_AUDIO_FRAMES) != 0) { LGTM. Also, FWIW, this is not flushing the encoder (It wasn't before this patch either). For being an API test it's not exactly using it right, but it doesn't really matter here since for FLAC, flushing the encoder will return a side data only packet with an updated stream header info and not any delayed/buffered packet, and this test only cares about comparing the raw pcm audio pre encoding and post decoding.
Quoting James Almer (2021-02-26 19:59:57) > > LGTM. > > Also, FWIW, this is not flushing the encoder (It wasn't before this > patch either). For being an API test it's not exactly using it right, > but it doesn't really matter here since for FLAC, flushing the encoder > will return a side data only packet with an updated stream header info > and not any delayed/buffered packet, and this test only cares about > comparing the raw pcm audio pre encoding and post decoding. I agree that this tests makes a bit too many assumptions, but I didn't want to rewrite everything, since I'd like to actually get to the bump reasonably soon.
diff --git a/tests/api/api-flac-test.c b/tests/api/api-flac-test.c index 7c96a4d99e..3d83c56987 100644 --- a/tests/api/api-flac-test.c +++ b/tests/api/api-flac-test.c @@ -113,7 +113,6 @@ static int run_test(AVCodec *enc, AVCodec *dec, AVCodecContext *enc_ctx, uint8_t *raw_in = NULL, *raw_out = NULL; int in_offset = 0, out_offset = 0; int result = 0; - int got_output = 0; int i = 0; int in_frame_bytes, out_frame_bytes; @@ -167,25 +166,40 @@ static int run_test(AVCodec *enc, AVCodec *dec, AVCodecContext *enc_ctx, } memcpy(raw_in + in_offset, in_frame->data[0], in_frame_bytes); in_offset += in_frame_bytes; - result = avcodec_encode_audio2(enc_ctx, &enc_pkt, in_frame, &got_output); + result = avcodec_send_frame(enc_ctx, in_frame); if (result < 0) { - av_log(NULL, AV_LOG_ERROR, "Error encoding audio frame\n"); + av_log(NULL, AV_LOG_ERROR, "Error submitting a frame for encoding\n"); return result; } - /* if we get an encoded packet, feed it straight to the decoder */ - if (got_output) { - result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt); + while (result >= 0) { + result = avcodec_receive_packet(enc_ctx, &enc_pkt); + if (result == AVERROR(EAGAIN)) + break; + else if (result < 0 && result != AVERROR_EOF) { + av_log(NULL, AV_LOG_ERROR, "Error encoding audio frame\n"); + return result; + } + + /* if we get an encoded packet, feed it straight to the decoder */ + result = avcodec_send_packet(dec_ctx, &enc_pkt); + av_packet_unref(&enc_pkt); if (result < 0) { - av_log(NULL, AV_LOG_ERROR, "Error decoding audio packet\n"); + av_log(NULL, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); return result; } - if (got_output) { - if (result != enc_pkt.size) { - av_log(NULL, AV_LOG_INFO, "Decoder consumed only part of a packet, it is allowed to do so -- need to update this test\n"); - return AVERROR_UNKNOWN; - } + result = avcodec_receive_frame(dec_ctx, out_frame); + if (result == AVERROR(EAGAIN)) { + result = 0; + continue; + } else if (result == AVERROR(EOF)) { + result = 0; + break; + } else if (result < 0) { + av_log(NULL, AV_LOG_ERROR, "Error decoding audio packet\n"); + return result; + } if (in_frame->nb_samples != out_frame->nb_samples) { av_log(NULL, AV_LOG_ERROR, "Error frames before and after decoding has different number of samples\n"); @@ -208,9 +222,7 @@ static int run_test(AVCodec *enc, AVCodec *dec, AVCodecContext *enc_ctx, } memcpy(raw_out + out_offset, out_frame->data[0], out_frame_bytes); out_offset += out_frame_bytes; - } } - av_packet_unref(&enc_pkt); } if (memcmp(raw_in, raw_out, out_frame_bytes * NUMBER_OF_AUDIO_FRAMES) != 0) {