X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=h264encode.cpp;h=3d8b463173aab3b5d2f3486d6b02688dc2db8f57;hb=55f06698ed6feb7c4d04b1d7282f86f6a12fcdc1;hp=44867cc6d1eda148f80fb09ece9911bc842b830a;hpb=69d5a2b610c8e05ad5a813c8f13aa919f42c1d76;p=nageru diff --git a/h264encode.cpp b/h264encode.cpp index 44867cc..3d8b463 100644 --- a/h264encode.cpp +++ b/h264encode.cpp @@ -155,6 +155,20 @@ typedef struct __bitstream bitstream; using namespace std; +// Supposedly vaRenderPicture() is supposed to destroy the buffer implicitly, +// but if we don't delete it here, we get leaks. The GStreamer implementation +// does the same. +static void render_picture_and_delete(VADisplay dpy, VAContextID context, VABufferID *buffers, int num_buffers) +{ + VAStatus va_status = vaRenderPicture(dpy, context, buffers, num_buffers); + CHECK_VASTATUS(va_status, "vaRenderPicture"); + + for (int i = 0; i < num_buffers; ++i) { + va_status = vaDestroyBuffer(va_dpy, buffers[i]); + CHECK_VASTATUS(va_status, "vaDestroyBuffer"); + } +} + static unsigned int va_swap32(unsigned int val) { @@ -1371,8 +1385,7 @@ static int render_sequence(void) render_id[0] = seq_param_buf; render_id[1] = rc_param_buf; - va_status = vaRenderPicture(va_dpy, context_id, &render_id[0], 2); - CHECK_VASTATUS(va_status, "vaRenderPicture");; + render_picture_and_delete(va_dpy, context_id, &render_id[0], 2); if (misc_priv_type != 0) { va_status = vaCreateBuffer(va_dpy, context_id, @@ -1385,7 +1398,7 @@ static int render_sequence(void) misc_param_tmp->data[0] = misc_priv_value; vaUnmapBuffer(va_dpy, misc_param_tmpbuf); - va_status = vaRenderPicture(va_dpy, context_id, &misc_param_tmpbuf, 1); + render_picture_and_delete(va_dpy, context_id, &misc_param_tmpbuf, 1); } return 0; @@ -1464,10 +1477,9 @@ static int render_picture(void) va_status = vaCreateBuffer(va_dpy, context_id, VAEncPictureParameterBufferType, sizeof(pic_param), 1, &pic_param, &pic_param_buf); - CHECK_VASTATUS(va_status, "vaCreateBuffer");; + CHECK_VASTATUS(va_status, "vaCreateBuffer"); - va_status = vaRenderPicture(va_dpy, context_id, &pic_param_buf, 1); - CHECK_VASTATUS(va_status, "vaRenderPicture"); + render_picture_and_delete(va_dpy, context_id, &pic_param_buf, 1); return 0; } @@ -1502,8 +1514,7 @@ static int render_packedsequence(void) render_id[0] = packedseq_para_bufid; render_id[1] = packedseq_data_bufid; - va_status = vaRenderPicture(va_dpy, context_id, render_id, 2); - CHECK_VASTATUS(va_status, "vaRenderPicture"); + render_picture_and_delete(va_dpy, context_id, render_id, 2); free(packedseq_buffer); @@ -1540,8 +1551,7 @@ static int render_packedpicture(void) render_id[0] = packedpic_para_bufid; render_id[1] = packedpic_data_bufid; - va_status = vaRenderPicture(va_dpy, context_id, render_id, 2); - CHECK_VASTATUS(va_status, "vaRenderPicture"); + render_picture_and_delete(va_dpy, context_id, render_id, 2); free(packedpic_buffer); @@ -1577,8 +1587,7 @@ static void render_packedslice() render_id[0] = packedslice_para_bufid; render_id[1] = packedslice_data_bufid; - va_status = vaRenderPicture(va_dpy, context_id, render_id, 2); - CHECK_VASTATUS(va_status, "vaRenderPicture"); + render_picture_and_delete(va_dpy, context_id, render_id, 2); free(packedslice_buffer); } @@ -1635,11 +1644,10 @@ static int render_slice(void) va_status = vaCreateBuffer(va_dpy, context_id, VAEncSliceParameterBufferType, sizeof(slice_param), 1, &slice_param, &slice_param_buf); - CHECK_VASTATUS(va_status, "vaCreateBuffer");; + CHECK_VASTATUS(va_status, "vaCreateBuffer"); + + render_picture_and_delete(va_dpy, context_id, &slice_param_buf, 1); - va_status = vaRenderPicture(va_dpy, context_id, &slice_param_buf, 1); - CHECK_VASTATUS(va_status, "vaRenderPicture"); - return 0; }