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.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to