mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 11:19:55 +00:00
avdevice/xcbgrab: wrap non-shm image replies in a buffer ref
This avoids a memcpy improving performance if SHM is not used. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
b66a800877
commit
648b8cca6c
@ -146,6 +146,11 @@ static int xcbgrab_reposition(AVFormatContext *s,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void xcbgrab_image_reply_free(void *opaque, uint8_t *data)
|
||||||
|
{
|
||||||
|
free(opaque);
|
||||||
|
}
|
||||||
|
|
||||||
static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
|
static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
XCBGrabContext *c = s->priv_data;
|
XCBGrabContext *c = s->priv_data;
|
||||||
@ -154,7 +159,7 @@ static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
|
|||||||
xcb_drawable_t drawable = c->screen->root;
|
xcb_drawable_t drawable = c->screen->root;
|
||||||
xcb_generic_error_t *e = NULL;
|
xcb_generic_error_t *e = NULL;
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
int length, ret;
|
int length;
|
||||||
|
|
||||||
iq = xcb_get_image(c->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, drawable,
|
iq = xcb_get_image(c->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, drawable,
|
||||||
c->x, c->y, c->width, c->height, ~0);
|
c->x, c->y, c->width, c->height, ~0);
|
||||||
@ -178,14 +183,18 @@ static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
|
|||||||
data = xcb_get_image_data(img);
|
data = xcb_get_image_data(img);
|
||||||
length = xcb_get_image_data_length(img);
|
length = xcb_get_image_data_length(img);
|
||||||
|
|
||||||
ret = av_new_packet(pkt, length);
|
av_init_packet(pkt);
|
||||||
|
|
||||||
if (!ret)
|
pkt->buf = av_buffer_create(data, length, xcbgrab_image_reply_free, img, 0);
|
||||||
memcpy(pkt->data, data, length);
|
if (!pkt->buf) {
|
||||||
|
free(img);
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
free(img);
|
pkt->data = data;
|
||||||
|
pkt->size = length;
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wait_frame(AVFormatContext *s, AVPacket *pkt)
|
static void wait_frame(AVFormatContext *s, AVPacket *pkt)
|
||||||
|
Loading…
Reference in New Issue
Block a user