Макросы в C ++ / FFMPEG - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в C ++ и пытаюсь создать собственный код c для FFMPEG. Я пытаюсь основать его на PCM, но только с одним типом. Я столкнулся с макросом и понятия не имею, во что превращается макрос после компиляции. Макрос выглядит следующим образом:

#define ENCODE_PLANAR(type, endian, dst, n, shift, offset)          \
n /= avctx->channels;                                               \
for (c = 0; c < avctx->channels; c++) {                             \
    int i;                                                          \
    samples_ ## type = (const type *) frame->extended_data[c];      \
    for (i = n; i > 0; i--) {                                       \
        register type v = (*samples_ ## type++ >> shift) + offset;  \
        bytestream_put_ ## endian(&dst, v);                         \
    }                                                               \
}

Будет ли строка объявления samples_ и строка bytestream_put равной тому, что я положил ниже, если endian = byte и type = uint8_t?

uint8_t samples_ = (const uint8_t *) frame->extended_data[c];
bytestream_put_byte(&dst, v);

Я нахожу это очень запутанно, и я не уверен, правильно ли это.

1 Ответ

0 голосов
/ 26 марта 2020

Этот макрос C (не C ++) используется в файле pcm. c FFmpeg, функции pcm_encode_frame. Аудиокадры PCM (8, 16, 24 или 32 бита) с различной конфигурацией канала и порядком байтов сохраняются в упакованном (чередующемся) или плоском формате. Этот макрос (как ясно видно в файле) используется для заполнения буферов в виде плоского формата.

Пример расширения будет таким (для AV_CODEC_ID_PCM_S16LE_PLANAR):

n /= avctx->channels;
for (c = 0; c < avctx->channels; c++) {
    int i;
    samples_int16_t = (const int16_t *) frame->extended_data[c];
    for (i = n; i > 0; i--) {
        register int16_t v = (*samples_int16_t++ >> 0) + 0;
        bytestream_put_le16(&dst, v);
    }
}

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...