From 529a90df418bd92d206dfeabfb2e1d01b454ad32 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 09 十月 2020 17:30:03 +0800
Subject: [PATCH] h264 mp4

---
 csrc/ffmpeg/format/FormatOut.cpp |   45 +++++++++++++++++++++++++--------------------
 1 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/csrc/ffmpeg/format/FormatOut.cpp b/csrc/ffmpeg/format/FormatOut.cpp
index b18c68c..d686d8e 100644
--- a/csrc/ffmpeg/format/FormatOut.cpp
+++ b/csrc/ffmpeg/format/FormatOut.cpp
@@ -467,7 +467,7 @@
                               bool interleaved/* = true*/){
 
         adjustPTS(pkt, frame_cnt);
-        auto ret = writeFrame2(pkt, interleaved);
+        auto ret = writeFrameInternal(pkt, interleaved);
         if (!ret){
             logIt("write to file failed, pkt.pts: %lld, dts: %lld, frame count: %d",
                     pkt->pts, pkt->dts, frame_cnt);
@@ -475,34 +475,39 @@
         return ret;
     }
 
-    bool FormatOut::writeFrame2(AVPacket *pkt, bool interleaved){
-        
+    static bool write_frame(AVFormatContext *ctx, AVPacket *pkt, bool interleaved){
+        int ret = 0;
+        if(interleaved){
+            ret = av_interleaved_write_frame(ctx, pkt);
+        }else{
+            // returns 1 if flushed and there is no more data to flush
+            ret = av_write_frame(ctx, pkt);
+        }
+
+        if(ret < -22 || ret == 0){
+            return true;
+        }
+
+        return false;
+    }
+
+    bool FormatOut::writeFrameInternal(AVPacket *pkt, bool interleaved){
+
         // h264_mp4toanatax
         if (bsf_h264){
             if (av_bsf_send_packet(bsf_h264, pkt) < 0){
                 logIt("bsf_h264 send packet failed");
                 return true;
             }
-            if (av_bsf_receive_packet(bsf_h264, pkt) < 0){
-                logIt("bsf_h264 recv packet failed");
-                return true;
+            int ret;
+            while((ret = av_bsf_receive_packet(bsf_h264, pkt)) == 0){
+                if (!write_frame(ctx_, pkt, interleaved)) return false;
             }
+
+            if (ret == AVERROR(EAGAIN)) return true;
         }
 
-        //
-        int ret = 0;
-        if(interleaved){
-            ret = av_interleaved_write_frame(ctx_, pkt);
-        }else{
-            // returns 1 if flushed and there is no more data to flush
-            ret = av_write_frame(ctx_, pkt);
-        }
-    
-        if(ret < -22 || ret == 0){
-            return true;
-        }
-
-        return false;
+        return write_frame(ctx_, pkt, interleaved);
     }
 
     bool FormatOut::writeTrailer(){

--
Gitblit v1.8.0