[FFmpeg-devel] [PATCH 09/18] avdevice/dshow: port to the new packet list API
James Almer
jamrial at gmail.com
Wed Nov 18 18:52:38 EET 2020
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavdevice/dshow.c | 52 +++++++++++++++++++++------------------------
1 file changed, 24 insertions(+), 28 deletions(-)
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index d7f5bd7069..ab158b13b6 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -58,7 +58,6 @@ static int
dshow_read_close(AVFormatContext *s)
{
struct dshow_ctx *ctx = s->priv_data;
- AVPacketList *pktl;
if (ctx->control) {
IMediaControl_Stop(ctx->control);
@@ -116,13 +115,7 @@ dshow_read_close(AVFormatContext *s)
if(ctx->event[1])
CloseHandle(ctx->event[1]);
- pktl = ctx->pktl;
- while (pktl) {
- AVPacketList *next = pktl->next;
- av_packet_unref(&pktl->pkt);
- av_free(pktl);
- pktl = next;
- }
+ av_packet_list_free(&ctx->pktl);
CoUninitialize();
@@ -162,7 +155,8 @@ callback(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time, e
{
AVFormatContext *s = priv_data;
struct dshow_ctx *ctx = s->priv_data;
- AVPacketList **ppktl, *pktl_next;
+ AVPacket pkt = { 0 };
+ int ret;
// dump_videohdr(s, vdhdr);
@@ -171,21 +165,19 @@ callback(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time, e
if(shall_we_drop(s, index, devtype))
goto fail;
- pktl_next = av_mallocz(sizeof(AVPacketList));
- if(!pktl_next)
+ if (av_new_packet(&pkt, buf_size) < 0)
goto fail;
- if(av_new_packet(&pktl_next->pkt, buf_size) < 0) {
- av_free(pktl_next);
+ pkt.stream_index = index;
+ pkt.pts = time;
+ memcpy(pkt.data, buf, buf_size);
+
+ ret = av_packet_list_put(ctx->pktl, &pkt, NULL, 0);
+ if (ret < 0) {
+ av_packet_unref(&pkt);
goto fail;
}
- pktl_next->pkt.stream_index = index;
- pktl_next->pkt.pts = time;
- memcpy(pktl_next->pkt.data, buf, buf_size);
-
- for(ppktl = &ctx->pktl ; *ppktl ; ppktl = &(*ppktl)->next);
- *ppktl = pktl_next;
ctx->curbufsize[index] += buf_size;
SetEvent(ctx->event[1]);
@@ -1113,6 +1105,12 @@ static int dshow_read_header(AVFormatContext *avctx)
}
}
+ ctx->pktl = av_packet_list_alloc();
+ if (!ctx->pktl) {
+ ret = AVERROR(ENOMEM);
+ goto error;
+ }
+
r = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
&IID_IGraphBuilder, (void **) &graph);
if (r != S_OK) {
@@ -1262,20 +1260,18 @@ static int dshow_check_event_queue(IMediaEvent *media_event)
static int dshow_read_packet(AVFormatContext *s, AVPacket *pkt)
{
struct dshow_ctx *ctx = s->priv_data;
- AVPacketList *pktl = NULL;
+ int ret = AVERROR(EAGAIN);
- while (!ctx->eof && !pktl) {
+ while (!ctx->eof && ret) {
WaitForSingleObject(ctx->mutex, INFINITE);
- pktl = ctx->pktl;
- if (pktl) {
- *pkt = pktl->pkt;
- ctx->pktl = ctx->pktl->next;
- av_free(pktl);
+
+ ret = av_packet_list_get(ctx->pktl, pkt, 0);
+ if (!ret)
ctx->curbufsize[pkt->stream_index] -= pkt->size;
- }
+
ResetEvent(ctx->event[1]);
ReleaseMutex(ctx->mutex);
- if (!pktl) {
+ if (ret) {
if (dshow_check_event_queue(ctx->media_event) < 0) {
ctx->eof = 1;
} else if (s->flags & AVFMT_FLAG_NONBLOCK) {
--
2.29.2
More information about the ffmpeg-devel
mailing list