diff options
Diffstat (limited to 'drivers/media/dvb-core/dvb_vb2.c')
-rw-r--r-- | drivers/media/dvb-core/dvb_vb2.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/drivers/media/dvb-core/dvb_vb2.c b/drivers/media/dvb-core/dvb_vb2.c index 763145d74e83..b811adf88afa 100644 --- a/drivers/media/dvb-core/dvb_vb2.c +++ b/drivers/media/dvb-core/dvb_vb2.c | |||
@@ -256,7 +256,8 @@ int dvb_vb2_is_streaming(struct dvb_vb2_ctx *ctx) | |||
256 | } | 256 | } |
257 | 257 | ||
258 | int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, | 258 | int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, |
259 | const unsigned char *src, int len) | 259 | const unsigned char *src, int len, |
260 | enum dmx_buffer_flags *buffer_flags) | ||
260 | { | 261 | { |
261 | unsigned long flags = 0; | 262 | unsigned long flags = 0; |
262 | void *vbuf = NULL; | 263 | void *vbuf = NULL; |
@@ -264,15 +265,17 @@ int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, | |||
264 | unsigned char *psrc = (unsigned char *)src; | 265 | unsigned char *psrc = (unsigned char *)src; |
265 | int ll = 0; | 266 | int ll = 0; |
266 | 267 | ||
267 | dprintk(3, "[%s] %d bytes are rcvd\n", ctx->name, len); | 268 | /* |
268 | if (!src) { | 269 | * normal case: This func is called twice from demux driver |
269 | dprintk(3, "[%s]:NULL pointer src\n", ctx->name); | 270 | * one with valid src pointer, second time with NULL pointer |
270 | /**normal case: This func is called twice from demux driver | 271 | */ |
271 | * once with valid src pointer, second time with NULL pointer | 272 | if (!src || !len) |
272 | */ | ||
273 | return 0; | 273 | return 0; |
274 | } | ||
275 | spin_lock_irqsave(&ctx->slock, flags); | 274 | spin_lock_irqsave(&ctx->slock, flags); |
275 | if (buffer_flags && *buffer_flags) { | ||
276 | ctx->flags |= *buffer_flags; | ||
277 | *buffer_flags = 0; | ||
278 | } | ||
276 | while (todo) { | 279 | while (todo) { |
277 | if (!ctx->buf) { | 280 | if (!ctx->buf) { |
278 | if (list_empty(&ctx->dvb_q)) { | 281 | if (list_empty(&ctx->dvb_q)) { |
@@ -395,6 +398,7 @@ int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) | |||
395 | 398 | ||
396 | int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) | 399 | int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) |
397 | { | 400 | { |
401 | unsigned long flags; | ||
398 | int ret; | 402 | int ret; |
399 | 403 | ||
400 | ret = vb2_core_dqbuf(&ctx->vb_q, &b->index, b, ctx->nonblocking); | 404 | ret = vb2_core_dqbuf(&ctx->vb_q, &b->index, b, ctx->nonblocking); |
@@ -402,7 +406,16 @@ int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) | |||
402 | dprintk(1, "[%s] errno=%d\n", ctx->name, ret); | 406 | dprintk(1, "[%s] errno=%d\n", ctx->name, ret); |
403 | return ret; | 407 | return ret; |
404 | } | 408 | } |
405 | dprintk(5, "[%s] index=%d\n", ctx->name, b->index); | 409 | |
410 | spin_lock_irqsave(&ctx->slock, flags); | ||
411 | b->count = ctx->count++; | ||
412 | b->flags = ctx->flags; | ||
413 | ctx->flags = 0; | ||
414 | spin_unlock_irqrestore(&ctx->slock, flags); | ||
415 | |||
416 | dprintk(5, "[%s] index=%d, count=%d, flags=%d\n", | ||
417 | ctx->name, b->index, ctx->count, b->flags); | ||
418 | |||
406 | 419 | ||
407 | return 0; | 420 | return 0; |
408 | } | 421 | } |