GUACAMOLE-1330: Merge dynamically allocate AVPacket when possible
This commit is contained in:
commit
73ac4fcdbe
@ -135,6 +135,15 @@ int guacenc_avcodec_encode_video(guacenc_video* video, AVFrame* frame) {
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
/* For libavcodec < 57.37.100: input/output was not decoupled and static
|
||||||
|
* allocation of AVPacket was supported.
|
||||||
|
*
|
||||||
|
* NOTE: Since dynamic allocation of AVPacket was added before this point (in
|
||||||
|
* 57.12.100) and static allocation was deprecated later (in 58.133.100), it is
|
||||||
|
* convenient to tie static vs. dynamic allocation to the old vs. new I/O
|
||||||
|
* mechanism and avoid further complicating the version comparison logic. */
|
||||||
|
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 37, 100)
|
||||||
|
|
||||||
/* Init video packet */
|
/* Init video packet */
|
||||||
AVPacket packet;
|
AVPacket packet;
|
||||||
av_init_packet(&packet);
|
av_init_packet(&packet);
|
||||||
@ -143,9 +152,6 @@ int guacenc_avcodec_encode_video(guacenc_video* video, AVFrame* frame) {
|
|||||||
packet.data = NULL;
|
packet.data = NULL;
|
||||||
packet.size = 0;
|
packet.size = 0;
|
||||||
|
|
||||||
/* For libavcodec < 57.37.100: input/output was not decoupled */
|
|
||||||
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57,37,100)
|
|
||||||
|
|
||||||
/* Write frame to video */
|
/* Write frame to video */
|
||||||
int got_data;
|
int got_data;
|
||||||
if (avcodec_encode_video2(video->context, &packet, frame, &got_data) < 0) {
|
if (avcodec_encode_video2(video->context, &packet, frame, &got_data) < 0) {
|
||||||
@ -176,19 +182,25 @@ int guacenc_avcodec_encode_video(guacenc_video* video, AVFrame* frame) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AVPacket* packet = av_packet_alloc();
|
||||||
|
if (packet == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
/* Flush all available packets */
|
/* Flush all available packets */
|
||||||
int got_data = 0;
|
int got_data = 0;
|
||||||
while (avcodec_receive_packet(video->context, &packet) == 0) {
|
while (avcodec_receive_packet(video->context, packet) == 0) {
|
||||||
|
|
||||||
/* Data was received */
|
/* Data was received */
|
||||||
got_data = 1;
|
got_data = 1;
|
||||||
|
|
||||||
/* Attempt to write data to output file */
|
/* Attempt to write data to output file */
|
||||||
guacenc_write_packet(video, (void*) &packet, packet.size);
|
guacenc_write_packet(video, (void*) packet, packet->size);
|
||||||
av_packet_unref(&packet);
|
av_packet_unref(packet);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
av_packet_free(&packet);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Frame may have been queued for later writing / reordering */
|
/* Frame may have been queued for later writing / reordering */
|
||||||
|
Loading…
Reference in New Issue
Block a user