From 18a05d269516a5e33d8460291c2f93e73d95adce Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 26 十二月 2023 10:45:31 +0800
Subject: [PATCH] GetYUV format is NV12

---
 csrc/worker/decoder.cpp |   43 ++++++++++++++++++++++++-------------------
 1 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp
index 5e8a7c9..4d5a3b7 100644
--- a/csrc/worker/decoder.cpp
+++ b/csrc/worker/decoder.cpp
@@ -95,6 +95,8 @@
                     next_idx_ = i.id + 1;
                     if (frame) {av_frame_free(&frame); frame = NULL;}
                     frame = frm;
+                }else {
+                    av_frame_free(&frm);
                 }
             }
         }
@@ -103,30 +105,33 @@
         int pix_fmt = frame->format;
         int width = frame->width;
         int height = frame->height;
-        int len = 0;
 
-        uint8_t *origin = cvbridge::extractFrame(frame, &len);
-        av_frame_free(&frame);
-        if (!origin) return;
-
-        uint8_t *finale = NULL;
         if (pix_fmt != AV_PIX_FMT_NV12){
-            finale = (uint8_t*)malloc(len);
 
-            unsigned char* SrcU = origin + width * height;
-            unsigned char* SrcV = SrcU + width * height / 4 ;
-            unsigned char* DstU = finale + width * height;
-            memcpy(finale, origin, width * height);
-            int i = 0;
-            for( i = 0 ; i < width * height / 4 ; i++ ){
-                *(DstU++) = *(SrcU++);
-                *(DstU++) = *(SrcV++);    
-            }
-            free(origin);
-        }else{
-            finale = origin;
+            cvbridge* bridge = new cvbridge(width, height, pix_fmt,
+                width, height, AV_PIX_FMT_NV12);
+            AVFrame* nv12 = bridge->convert2Frame(frame);
+            av_frame_free(&frame);
+            frame = nv12;
+            delete bridge;
+
+            // finale = (uint8_t*)malloc(len);
+            // unsigned char* SrcU = origin + width * height;
+            // unsigned char* SrcV = SrcU + width * height / 4 ;
+            // unsigned char* DstU = finale + width * height;
+            // memcpy(finale, origin, width * height);
+            // int i = 0;
+            // for( i = 0 ; i < width * height / 4 ; i++ ){
+            //     *(DstU++) = *(SrcU++);
+            //     *(DstU++) = *(SrcV++);
+            // }
+            // free(origin);
         }
 
+        int len = 0;
+        uint8_t* finale = cvbridge::extractFrame(frame, &len);
+        av_frame_free(&frame);
+
         *data = finale;
         *w = width;
         *h = height;

--
Gitblit v1.8.0