diff options
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-fileops.c')
-rw-r--r-- | drivers/media/video/ivtv/ivtv-fileops.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/media/video/ivtv/ivtv-fileops.c b/drivers/media/video/ivtv/ivtv-fileops.c index 58ad0d9c680a..6fb96f19a866 100644 --- a/drivers/media/video/ivtv/ivtv-fileops.c +++ b/drivers/media/video/ivtv/ivtv-fileops.c | |||
@@ -581,6 +581,24 @@ ssize_t ivtv_v4l2_write(struct file *filp, const char __user *user_buf, size_t c | |||
581 | set_bit(IVTV_F_S_APPL_IO, &s->s_flags); | 581 | set_bit(IVTV_F_S_APPL_IO, &s->s_flags); |
582 | 582 | ||
583 | retry: | 583 | retry: |
584 | /* If possible, just DMA the entire frame - Check the data transfer size | ||
585 | since we may get here before the stream has been fully set-up */ | ||
586 | if (mode == OUT_YUV && s->q_full.length == 0 && itv->dma_data_req_size) { | ||
587 | while (count >= itv->dma_data_req_size) { | ||
588 | if (!ivtv_yuv_udma_stream_frame (itv, (void *)user_buf)) { | ||
589 | bytes_written += itv->dma_data_req_size; | ||
590 | user_buf += itv->dma_data_req_size; | ||
591 | count -= itv->dma_data_req_size; | ||
592 | } else { | ||
593 | break; | ||
594 | } | ||
595 | } | ||
596 | if (count == 0) { | ||
597 | IVTV_DEBUG_HI_FILE("Wrote %d bytes to %s (%d)\n", bytes_written, s->name, s->q_full.bytesused); | ||
598 | return bytes_written; | ||
599 | } | ||
600 | } | ||
601 | |||
584 | for (;;) { | 602 | for (;;) { |
585 | /* Gather buffers */ | 603 | /* Gather buffers */ |
586 | while (q.length - q.bytesused < count && (buf = ivtv_dequeue(s, &s->q_io))) | 604 | while (q.length - q.bytesused < count && (buf = ivtv_dequeue(s, &s->q_io))) |
@@ -660,6 +678,9 @@ retry: | |||
660 | if (s->q_full.length >= itv->dma_data_req_size) { | 678 | if (s->q_full.length >= itv->dma_data_req_size) { |
661 | int got_sig; | 679 | int got_sig; |
662 | 680 | ||
681 | if (mode == OUT_YUV) | ||
682 | ivtv_yuv_setup_stream_frame(itv); | ||
683 | |||
663 | prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE); | 684 | prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE); |
664 | while (!(got_sig = signal_pending(current)) && | 685 | while (!(got_sig = signal_pending(current)) && |
665 | test_bit(IVTV_F_S_DMA_PENDING, &s->s_flags)) { | 686 | test_bit(IVTV_F_S_DMA_PENDING, &s->s_flags)) { |
@@ -946,7 +967,7 @@ static int ivtv_serialized_open(struct ivtv_stream *s, struct file *filp) | |||
946 | set_bit(IVTV_F_I_DEC_YUV, &itv->i_flags); | 967 | set_bit(IVTV_F_I_DEC_YUV, &itv->i_flags); |
947 | /* For yuv, we need to know the dma size before we start */ | 968 | /* For yuv, we need to know the dma size before we start */ |
948 | itv->dma_data_req_size = | 969 | itv->dma_data_req_size = |
949 | itv->params.width * itv->params.height * 3 / 2; | 970 | 1080 * ((itv->yuv_info.v4l2_src_h + 31) & ~31); |
950 | itv->yuv_info.stream_size = 0; | 971 | itv->yuv_info.stream_size = 0; |
951 | } | 972 | } |
952 | return 0; | 973 | return 0; |