Создать копию структуры AVPacket

Я хотел бы сделать копию AVPacket, чтобы я мог декодировать ее позже, когда захочу.

AVPacket от аудиопотока.

av_dup_packet, похоже, не работает.

Конструктор копирования AVPacket не работает.

Создание моего собственного конструктора копирования вызывает повреждение памяти.

1

Решение

Способ скопировать структуру AVPacket: (это работает)

AVPacket newPacket(oldPacket);
newPacket->data = reinterpret_cast<uint8_t*>(new uint64_t[(oldPacket->size + FF_INPUT_BUFFER_PADDING_SIZE)/sizeof(uint64_t) + 1]);
memcpy(newPacket->data, oldPacket->data, oldPacket->size);

Причина в том, что некоторые декодеры используют оптимизации, которые требуют определенного выравнивания байтов и заполнения. Простое выделение oldPacket-> size не выделяет достаточно и не выделяет при правильном выравнивании байтов.

Обратите внимание, что это может работать не во всех случаях, например, если для priv установлено что-то интересное.

4

Другие решения

        AVPacket *newpacket = (AVPacket*)malloc(sizeof(struct AVPacket));
av_init_packet(newpacket);
av_packet_ref(newpacket, packet);

av_packet_unref(packet);
free(packet);
packet = nil;

Поскольку функция av_dup_packet устарела с октября 2015 года
094952
лучше использовать вместо этого av_packet_ref / av_packet_unref.
Новый пакет должен быть выделен из памяти и после инициирован с помощью av_init_packet

2

По вопросам рекламы [email protected]