FFmpeg Side data 설정

2023. 9. 21. 10:37Multimedia

    목차
반응형

AVFrame에 부가적인 정보를 실어 보내고자 하는 경우 side data를 AVFrame에 추가할 수 있습니다. 본 글에서는 이와 관련된 방법에 대해 살펴보고자 합니다. 

SIDE DATA TYPE 추가

우선 AVFrame에 추가하고자 하는 side data의 type을 libavutil/frame.h 파일 내 AVFrameSideDataType에 추가합니다.

type 식별 key 추가

enum AVFrameSideDataType {
    ...
    /**
     * Ambient viewing environment metadata, as defined by H.274.
     */
    AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT,

    AV_FRAME_DATA_TEST,        // 추가

type 정의

typedef struct _TestSideData {
    int test;
} TestSideData;

type 생성 획득 기능 구현

libavfilter 밑 혹은 적당한 위치에 side data를 생성하고 획득하는 기능을 구현합니다.

TestSideData를 생성하는 코드를 작성합니다. av_frame_new_side_data를 호출하여 custom한 side data를 생성하며, 호출 시 넘기는 두 번째 인자인 AV_FRAME_DATA_TEST를 통해 AVFrame 내 side data 배열의 위치에 custom한 side data를 할당합니다.

TestSideData *av_test_create_side_data(AVFrame *frame)
{
    AVFrameSideData *sd = av_frame_new_side_data(frame, AV_FRAME_DATA_TEST, sizeof(TestSideData));
    if (!sd) {
        return NULL;
    }

    TestSideData *psd = (TestSideData *)sd->data;
    memset(psd, 0, sizeof(TestSideData));
    return psd;
}

AVFrameSideData는 다음과 같이 정의되어 있습니다.

typedef struct AVFrameSideData {
    enum AVFrameSideDataType type;
    uint8_t *data;
    size_t   size;
    AVDictionary *metadata;
    AVBufferRef *buf;
} AVFrameSideData;

data 필드에 custom한 side data가 할당되며,

이번에는 다음과 같이 AVFrame을 통해 side data를 획득하는 기능을 구현합니다.
side data에 대한 meta data를 AVDictionary에 추가할 수 있습니다.

TestSideData *av_test_get_side_data(AVFrame *frame)
{
    TestSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_TEST);
    if (!sd) {
        return NULL; 
    }

    return (TestSideData *)sd->data;
}

side data 사용 ex.

생성 ex.

어떤 임이의 필터에서 위에서 정의한 side data를 생성해 보겠습니다.

static int handle_frame(SomeContext *s, AVFrame *frame)
{
    TestSideData *sd = av_test_get_side_data(frame);
    if (!sd) {
        sd = av_test_create_side_data(frame);
        if (!sd) {
            return AVERROR(ENOMEM);
        }
    }

    sd->test = 1;    // set test value
    return 0;
}

획득 ex.

위에서 custom side data를 생성하고 이를 AVFrame에 설정한 코드를 살펴 봤습니다. 이번에는 다른 filter에서 이를 사용하는 코드를 살펴보겠습니다.
필터 그라프의 뒷단에 붙는 filter에서 custom side data를 획득하는 방법입니다.

static int check_side_data(AVFrame *frame)
{
    TestSideData *sd = av_test_get_side_data(frame);
    if (sd) {
        // sd의 test 필드 내 설정된 값을 사용하는 코드
    }
}
반응형

'Multimedia' 카테고리의 다른 글

FFmpeg에서 의존 라이브러리 지정  (0) 2023.10.19
동영상 컨텐츠 종류 (UCC, RMC 등)  (0) 2023.09.26
FFmpeg filter 개발  (0) 2023.09.20
CQ vs. CRF  (0) 2023.09.01
JPEG 파일 분석 tool jpeginfo  (0) 2023.08.21