int num_sensor_formats;
        /* pointing to current video buffer */
        struct bcap_buffer *cur_frm;
-       /* pointing to next video buffer */
-       struct bcap_buffer *next_frm;
        /* buffer queue used in videobuf2 */
        struct vb2_queue buffer_queue;
        /* allocator-specific contexts for each plane */
 
        /* release all active buffers */
        while (!list_empty(&bcap_dev->dma_queue)) {
-               bcap_dev->next_frm = list_entry(bcap_dev->dma_queue.next,
+               bcap_dev->cur_frm = list_entry(bcap_dev->dma_queue.next,
                                                struct bcap_buffer, list);
-               list_del(&bcap_dev->next_frm->list);
-               vb2_buffer_done(&bcap_dev->next_frm->vb, VB2_BUF_STATE_ERROR);
+               list_del(&bcap_dev->cur_frm->list);
+               vb2_buffer_done(&bcap_dev->cur_frm->vb, VB2_BUF_STATE_ERROR);
        }
        return 0;
 }
 
        spin_lock(&bcap_dev->lock);
 
-       if (bcap_dev->cur_frm != bcap_dev->next_frm) {
+       if (!list_empty(&bcap_dev->dma_queue)) {
                v4l2_get_timestamp(&vb->v4l2_buf.timestamp);
-               vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
-               bcap_dev->cur_frm = bcap_dev->next_frm;
+               if (ppi->err) {
+                       vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
+                       ppi->err = false;
+               } else {
+                       vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
+               }
+               bcap_dev->cur_frm = list_entry(bcap_dev->dma_queue.next,
+                               struct bcap_buffer, list);
+               list_del(&bcap_dev->cur_frm->list);
+       } else {
+               /* clear error flag, we will get a new frame */
+               if (ppi->err)
+                       ppi->err = false;
        }
 
        ppi->ops->stop(ppi);
        if (bcap_dev->stop) {
                complete(&bcap_dev->comp);
        } else {
-               if (!list_empty(&bcap_dev->dma_queue)) {
-                       bcap_dev->next_frm = list_entry(bcap_dev->dma_queue.next,
-                                               struct bcap_buffer, list);
-                       list_del(&bcap_dev->next_frm->list);
-                       addr = vb2_dma_contig_plane_dma_addr(&bcap_dev->next_frm->vb, 0);
-                       ppi->ops->update_addr(ppi, (unsigned long)addr);
-               }
+               addr = vb2_dma_contig_plane_dma_addr(&bcap_dev->cur_frm->vb, 0);
+               ppi->ops->update_addr(ppi, (unsigned long)addr);
                ppi->ops->start(ppi);
        }
 
        }
 
        /* get the next frame from the dma queue */
-       bcap_dev->next_frm = list_entry(bcap_dev->dma_queue.next,
+       bcap_dev->cur_frm = list_entry(bcap_dev->dma_queue.next,
                                        struct bcap_buffer, list);
-       bcap_dev->cur_frm = bcap_dev->next_frm;
        /* remove buffer from the dma queue */
        list_del(&bcap_dev->cur_frm->list);
        addr = vb2_dma_contig_plane_dma_addr(&bcap_dev->cur_frm->vb, 0);