video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2023-12-26 18a05d269516a5e33d8460291c2f93e73d95adce
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;