0

そこで、入力フレームのピクセル データ (RGB 8 形式を使用して保存) を単純に読み取り、出力バッファーに直接配置する ffmpeg の基本的なデコーダーを作成しました。(RGB 8 も) 問題は、このデコーダーを ffmpeg で使用すると、解放されていないバッファーが 1 つあると表示されることです (ffmpeg -i Test.utah Test.png を使用してテスト済み)。残念ながら、独自のバッファーを作成していないため、どのバッファーについて話しているのかわかりません。デコーダーの終了メソッドで AVContext の coded_frame バッファーを解放しようとしましたが、これによりセグメンテーション エラーが発生します。

どんな助けでも大歓迎です。

static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
{
    int ret;           /*Hold return from get_buffer */ 
    int skipSize;      /*Number of dummy bytes to skip per line*/
    int fseek=8;       /*Location of the first pixel*/
    int i=0; int j=0;  /*Output buffer seek index/Input Buffer seek index*/
    const uint8_t *buf = avpkt->data; /*Hold a pointer to the input buffer*/
    AVFrame *pict=data; /*Hold a pointer to the output buffer*/

    /*Set the output pixel format to RGB8*/
    avctx->pix_fmt = AV_PIX_FMT_RGB8;

    /*Get the width and height*/
    bytestream_get_le32(&buf);
    avctx->width=bytestream_get_le16(&buf);
    avctx->height=bytestream_get_le16(&buf);

    /*Release the old buffer*/
    if (pict->data[0]) avctx->release_buffer(avctx, pict);

    /*Aquire a large enough data buffer to hold the decompressed picture*/
    if (ret=ff_get_buffer(avctx, pict) < 0) return ret;
    skipSize=pict->linesize[0] - avctx->width; 

    /*Transfer input buffer to output buffer*/
    for(int y=0;y<avctx->height;y++){
        for(int x=0;x<avctx->width;x++){
            pict->data[0][i]=avpkt->data[fseek+j];
            j++;
            i++;
        }
        i+=skipSize;
    }

    /*Inform ffmpeg the output is a key frame and that it is ready for external usage*/
    pict->pict_type        = AV_PICTURE_TYPE_I;
    pict->key_frame        = 1;
    *got_frame=1;
    return 0;
}
4

1 に答える 1

1

このデコーダー オブジェクトの .close メソッドを投稿しませんでした。持っていますか?ほとんどの FFmpeg デコーダーでは、これはcodecname_decode_end(). このメソッド/関数は、デコードが終了した後に呼び出され、デコーダーにクリーンアップの機会を与えます。

私はこれでどこに行くのですか:

decode_frame call #0: no frame held; frame allocated
decode_frame call #1: free frame allocated during call #0; frame allocated
decode_frame call #2: free frame allocated during call #1; frame allocated
[...]
decode_frame call #n: free frame allocated during call #(n-1); frame allocated

しかし、すべて完了しても、decode_frame 呼び出し #n で割り当てられたフレームはまだデコーダーに保持されています。codecname_decode_end()デコーダーがその最後のフレームを解放できるようにします。

于 2013-03-11T20:26:02.290 に答える