2012-10-17 5 views
1

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

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

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

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

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

ответ

4

Способ скопировать структуру 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 не выделяет достаточно и не выделяет при правильном выравнивании байтов.

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

1
 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

+1

Было бы неплохо, если бы вы добавили некоторое описание того, почему это решает проблему. – Soren

+0

Вау, прошло уже четыре года? Да, это может сработать, поскольку управление памятью обрабатывается libav. У вас нет времени на тестирование. – 0xbaadf00d

Смежные вопросы