summaryrefslogtreecommitdiffstats
path: root/libhb/deinterlace.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/deinterlace.c')
-rw-r--r--libhb/deinterlace.c74
1 files changed, 24 insertions, 50 deletions
diff --git a/libhb/deinterlace.c b/libhb/deinterlace.c
index cd68a6070..a402a5253 100644
--- a/libhb/deinterlace.c
+++ b/libhb/deinterlace.c
@@ -390,7 +390,9 @@ static hb_buffer_t * deint_fast(hb_filter_private_t * pv, hb_buffer_t * in)
int ii;
hb_buffer_t *dst, *src;
+ hb_buffer_list_t list;
+ hb_buffer_list_clear(&list);
if (in != NULL)
{
dst = hb_frame_buffer_init(in->f.fmt, in->f.width, in->f.height);
@@ -409,42 +411,20 @@ static hb_buffer_t * deint_fast(hb_filter_private_t * pv, hb_buffer_t * in)
taskset_cycle( &pv->deint_taskset );
}
- hb_buffer_t *first = NULL, *last = NULL;
for (ii = 0; ii < pv->deint_nsegs; ii++)
{
src = pv->deint_arguments[ii].src;
dst = pv->deint_arguments[ii].dst;
pv->deint_arguments[ii].src = NULL;
pv->deint_arguments[ii].dst = NULL;
- if (first == NULL)
- {
- first = dst;
- }
- if (last != NULL)
- {
- last->next = dst;
- }
- last = dst;
+ hb_buffer_list_append(&list, dst);
dst->s = src->s;
hb_buffer_close(&src);
}
- if (in == NULL)
- {
- // Flushing final buffers. Append EOS marker buffer.
- dst = hb_buffer_eof_init();
- if (first == NULL)
- {
- first = dst;
- }
- else
- {
- last->next = dst;
- }
- }
pv->deint_nsegs = 0;
- return first;
+ return hb_buffer_list_clear(&list);
}
static int hb_deinterlace_init( hb_filter_object_t * filter,
@@ -580,30 +560,31 @@ static int hb_deinterlace_work( hb_filter_object_t * filter,
{
hb_filter_private_t * pv = filter->private_data;
hb_buffer_t * in = *buf_in;
- hb_buffer_t * last = NULL, * out = NULL;
+ hb_buffer_list_t list;
+ *buf_in = NULL;
+ hb_buffer_list_clear(&list);
if (in->s.flags & HB_BUF_FLAG_EOF)
{
- *buf_out = in;
- *buf_in = NULL;
if( !( pv->yadif_mode & MODE_YADIF_ENABLE ) )
{
// Flush final frames
- *buf_out = deint_fast(pv, NULL);
+ hb_buffer_list_append(&list, deint_fast(pv, NULL));
}
+ hb_buffer_list_append(&list, in);
+
+ *buf_out = hb_buffer_list_clear(&list);
return HB_FILTER_DONE;
}
- /* Use libavcodec deinterlace if yadif_mode < 0 */
+ /* Use fast deinterlace if yadif_mode < 0 */
if( !( pv->yadif_mode & MODE_YADIF_ENABLE ) )
{
- *buf_in = NULL;
*buf_out = deint_fast(pv, in);
return HB_FILTER_OK;
}
/* Store current frame in yadif cache */
- *buf_in = NULL;
yadif_store_ref(pv, in);
// yadif requires 3 buffers, prev, cur, and next. For the first
@@ -647,7 +628,8 @@ static int hb_deinterlace_work( hb_filter_object_t * filter,
if (o_buf[idx] == NULL)
{
- o_buf[idx] = hb_frame_buffer_init(in->f.fmt, in->f.width, in->f.height);
+ o_buf[idx] = hb_frame_buffer_init(in->f.fmt,
+ in->f.width, in->f.height);
}
yadif_filter(pv, o_buf[idx], parity, tff);
@@ -655,22 +637,13 @@ static int hb_deinterlace_work( hb_filter_object_t * filter,
// else, add only final frame
if (( pv->yadif_mode & MODE_YADIF_BOB ) || frame == num_frames - 1)
{
- if ( out == NULL )
- {
- last = out = o_buf[idx];
- }
- else
- {
- last->next = o_buf[idx];
- last = last->next;
- }
- last->next = NULL;
+ /* Copy buffered settings to output buffer settings */
+ o_buf[idx]->s = pv->yadif_ref[1]->s;
+ o_buf[idx]->next = NULL;
+ hb_buffer_list_append(&list, o_buf[idx]);
// Indicate that buffer was consumed
o_buf[idx] = NULL;
-
- /* Copy buffered settings to output buffer settings */
- last->s = pv->yadif_ref[1]->s;
idx ^= 1;
}
}
@@ -681,13 +654,14 @@ static int hb_deinterlace_work( hb_filter_object_t * filter,
* timestamps. */
if (pv->yadif_mode & MODE_YADIF_BOB)
{
- out->s.stop -= (out->s.stop - out->s.start) / 2LL;
- last->s.start = out->s.stop;
- last->s.new_chap = 0;
+ hb_buffer_t *first = hb_buffer_list_head(&list);
+ hb_buffer_t *second = hb_buffer_list_tail(&list);
+ first->s.stop -= (first->s.stop - first->s.start) / 2LL;
+ second->s.start = first->s.stop;
+ second->s.new_chap = 0;
}
- *buf_out = out;
-
+ *buf_out = hb_buffer_list_clear(&list);
return HB_FILTER_OK;
}