hb_filter_private_t * pv = filter->private_data;
hb_buffer_t * in = *buf_in;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_filter_private_t * pv = filter->private_data;
hb_buffer_t * in = *buf_in, * out;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_work_private_t * pv = w->private_data;
hb_buffer_t * in = *buf_in;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input stream - send it downstream & say that we're done */
*buf_out = in;
#endif
flushDelayQueue(pv);
if (pv->list_subtitle != NULL)
- cc_send_to_decoder(pv, hb_buffer_init(0));
+ cc_send_to_decoder(pv, hb_buffer_eof_init());
}
}
*buf_out = NULL;
/* if we got an empty buffer signaling end-of-stream send it downstream */
- if ( in->size == 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
if (pv->context != NULL && pv->context->codec != NULL)
{
- decodeVideo( w, in->data, in->size, in->sequence, pts, dts, in->s.frametype );
+ decodeVideo(w, in->data, 0, 0, pts, dts, 0);
}
hb_list_add( pv->list, in );
*buf_out = link_buf_list( pv );
if ( codec == NULL )
{
hb_log( "decavcodecvWork: failed to find codec for id (%d)", w->codec_param );
- *buf_out = hb_buffer_init( 0 );;
+ *buf_out = hb_buffer_eof_init();
return HB_WORK_DONE;
}
{
av_dict_free( &av_opts );
hb_log( "decavcodecvWork: avcodec_open failed" );
- *buf_out = hb_buffer_init( 0 );;
+ *buf_out = hb_buffer_eof_init();
return HB_WORK_DONE;
}
av_dict_free( &av_opts );
hb_work_private_t * pv = w->private_data;
hb_buffer_t * in = *buf_in;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input stream - send it downstream & say that we're done */
handle_end_of_data(pv->cc608);
hb_buffer_t *in = *buf_in;
hb_buffer_t *buf = NULL;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input stream - send it downstream & say that we're done */
*buf_out = in;
hb_buffer_t * in = *buf_in;
hb_buffer_t * last = NULL, * out = NULL;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_work_private_t * pv = w->private_data;
hb_buffer_t * in = *buf_in;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input stream - send it downstream & say that we're done */
if ( pv->list_buffer == NULL )
printf("\nPACKET(%"PRId64",%"PRId64"): %.*s\n", in->s.start/90, in->s.stop/90, in->size, in->data);
#endif
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_log( "dectx3gsub: subtitle packet lacks duration" );
}
- if (in->size == 0)
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_buffer_t **buf_in, hb_buffer_t **buf_out)
{
hb_work_private_t * pv = w->private_data;
- // Pass the packets through without modification
+ hb_buffer_t * in = *buf_in;
hb_buffer_t *out = *buf_in;
- out->s.frametype = HB_FRAME_SUBTITLE;
+ *buf_in = NULL;
+ if (in->s.flags & HB_BUF_FLAG_EOF)
+ {
+ *buf_out = in;
+ return HB_WORK_DONE;
+ }
// Warn if the subtitle's duration has not been passed through by the
// demuxer, which will prevent the subtitle from displaying at all
}
hb_srt_to_ssa(out, ++pv->line);
-
- *buf_in = NULL;
+ out->s.frametype = HB_FRAME_SUBTITLE;
*buf_out = out;
- if (out->size == 0)
- return HB_WORK_DONE;
return HB_WORK_OK;
}
hb_buffer_t * in = *buf_in;
int size_sub, size_rle;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input stream - send it downstream & say that we're done */
*buf_out = in;
if (in == NULL)
{
// Flushing final buffers. Append EOS marker buffer.
- dst = hb_buffer_init(0);
+ dst = hb_buffer_eof_init();
if (first == NULL)
{
first = dst;
hb_buffer_t * in = *buf_in;
hb_buffer_t * last = NULL, * out = NULL;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_filter_private_t * pv = filter->private_data;
hb_buffer_t * in = *buf_in, * out;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_filter_private_t * pv = filter->private_data;
hb_buffer_t * in = *buf_in, * out;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
* EOF on input. Flush the decoder, then send the
* EOF downstream to let the muxer know we're done.
*/
- if (in->size <= 0)
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
qsv_enc_work(pv, NULL, NULL);
hb_list_add(pv->encoded_frames, in);
hb_job_t * job = pv->job;
AVFrame * frame;
hb_buffer_t * in = *buf_in, * buf;
- char final_flushing_call = (in->size <= 0);
+ char final_flushing_call = !!(in->s.flags & HB_BUF_FLAG_EOF);
if ( final_flushing_call )
{
//make a flushing call to encode for codecs that can encode out of order
if( last )
{
- last->next = hb_buffer_init( 0 );
+ last->next = hb_buffer_eof_init();
}
else
{
- first = hb_buffer_init( 0 );
+ first = hb_buffer_eof_init();
}
return first;
hb_work_private_t * pv = w->private_data;
hb_buffer_t * in = *buf_in, * buf;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input - send it downstream & say we're done */
*buf_out = Flush( w );
hb_buffer_t * in = *buf_in;
hb_buffer_t * buf;
- if ( (*buf_in)->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input - send it downstream & say we're done */
int frame_width, frame_height;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
// EOF on input - send it downstream & say we're done.
// XXX may need to flush packets via a call to
// Invalid source, send EOF, this shouldn't ever happen
hb_log("encvobsub: invalid subtitle source");
hb_buffer_close( buf_in );
- *buf_out = hb_buffer_init(0);
+ *buf_out = hb_buffer_eof_init();
}
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input stream - send it downstream & say that we're done */
*buf_out = in;
hb_buffer_t ** buf_out )
{
hb_work_private_t * pv = w->private_data;
+ hb_buffer_t * in = *buf_in;
hb_buffer_t * buf;
- if ( (*buf_in)->size <= 0 )
+ *buf_in = NULL;
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
/* EOF on input - send it downstream & say we're done */
- *buf_out = *buf_in;
- *buf_in = NULL;
+ *buf_out = in;
return HB_WORK_DONE;
}
hb_list_add( pv->list, *buf_in );
- *buf_in = NULL;
*buf_out = buf = Encode( w );
-
while( buf )
{
buf->next = Encode( w );
*buf_out = NULL;
- if( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
// EOF on input. Flush any frames still in the decoder then
// send the eof downstream to tell the muxer we're done.
hb_work_private_t *pv = w->private_data;
hb_buffer_t *in = *buf_in;
- if (in->size <= 0)
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
uint32_t nnal;
x265_nal *nal;
return hb_buffer_init_internal(size, 0);
}
+hb_buffer_t * hb_buffer_eof_init(void)
+{
+ hb_buffer_t * buf = hb_buffer_init(0);
+ buf->s.flags = HB_BUF_FLAG_EOF;
+ return buf;
+}
+
void hb_buffer_realloc( hb_buffer_t * b, int size )
{
if ( size > b->alloc || b->data == NULL )
#define HB_FRAME_KEY 0x0F
#define HB_FRAME_REF 0xF0
uint8_t frametype;
+
+// Picture flags used by filters
+#ifndef PIC_FLAG_REPEAT_FIRST_FIELD
+#define PIC_FLAG_REPEAT_FIRST_FIELD 0x0100
+#endif
+#ifndef PIC_FLAG_TOP_FIELD_FIRST
+#define PIC_FLAG_TOP_FIELD_FIRST 0x0008
+#endif
+#ifndef PIC_FLAG_PROGRESSIVE_FRAME
+#define PIC_FLAG_PROGRESSIVE_FRAME 0x0010
+#endif
+#define PIC_FLAG_REPEAT_FRAME 0x0200
+#define HB_BUF_FLAG_EOF 0x0400
uint16_t flags;
};
void hb_buffer_pool_free( void );
hb_buffer_t * hb_buffer_init( int size );
+hb_buffer_t * hb_buffer_eof_init( void );
hb_buffer_t * hb_frame_buffer_init( int pix_fmt, int w, int h);
void hb_buffer_init_planes( hb_buffer_t * b );
void hb_buffer_realloc( hb_buffer_t *, int size );
extern hb_filter_object_t hb_filter_qsv_post;
#endif
-// Picture flags used by filters
-#ifndef PIC_FLAG_REPEAT_FIRST_FIELD
-#define PIC_FLAG_REPEAT_FIRST_FIELD 256
-#endif
-#ifndef PIC_FLAG_TOP_FIELD_FIRST
-#define PIC_FLAG_TOP_FIELD_FIRST 8
-#endif
-#ifndef PIC_FLAG_PROGRESSIVE_FRAME
-#define PIC_FLAG_PROGRESSIVE_FRAME 16
-#endif
-
-#define PIC_FLAG_REPEAT_FRAME 512
-
extern hb_work_object_t * hb_objects;
#define HB_WORK_IDLE 0
return HB_WORK_DONE;
}
- if ( buf->size <= 0 )
+ if (buf->s.flags & HB_BUF_FLAG_EOF)
{
// EOF - mark this track as done
hb_buffer_close( &buf );
hb_filter_private_t *pv = filter->private_data;
hb_buffer_t *in = *buf_in;
- if (in->size <= 0)
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
hb_buffer_t *last;
// Flush buffered frames
hb_buffer_t **buf_out)
{
hb_work_private_t *pv = w->private_data;
+ hb_buffer_t * in = *buf_in;
hb_buffer_t *buf;
- if ((*buf_in)->size <= 0)
+ *buf_in = NULL;
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
// EOF on input. Finish encoding what we have buffered then send
// it & the eof downstream.
- *buf_out = Flush(w, *buf_in);
- *buf_in = NULL;
+ *buf_out = Flush(w, in);
return HB_WORK_DONE;
}
- hb_list_add(pv->list, *buf_in);
- *buf_in = NULL;
+ hb_list_add(pv->list, in);
*buf_out = buf = Encode(w);
*buf_in = NULL;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
while(1){
sts = process_frame(in->qsv_details.qsv_atom, qsv, pv);
if(!in->qsv_details.filter_details)
in->qsv_details.filter_details = pv;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
hb_buffer_t * in = *buf_in;
hb_buffer_t * out = *buf_out;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
// send empty buffers downstream to video & audio decoders to signal we're done.
if( !*r->die && !r->job->done )
{
- push_buf( r, r->job->fifo_mpeg2, hb_buffer_init(0) );
+ push_buf(r, r->job->fifo_mpeg2, hb_buffer_eof_init());
hb_audio_t *audio;
for( n = 0; (audio = hb_list_item( r->job->list_audio, n)); ++n )
{
if ( audio->priv.fifo_in )
- push_buf( r, audio->priv.fifo_in, hb_buffer_init(0) );
+ push_buf(r, audio->priv.fifo_in, hb_buffer_eof_init());
}
hb_subtitle_t *subtitle;
for( n = 0; (subtitle = hb_list_item( r->job->list_subtitle, n)); ++n )
{
if ( subtitle->fifo_in && subtitle->source == VOBSUB)
- push_buf( r, subtitle->fifo_in, hb_buffer_init(0) );
+ push_buf(r, subtitle->fifo_in, hb_buffer_eof_init());
}
}
hb_buffer_t * in = *buf_in;
hb_buffer_t * sub;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_in = NULL;
*buf_out = in;
filter->subtitle->extradata_size);
pv->script_initialized = 1;
}
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_in = NULL;
*buf_out = in;
pv->script_initialized = 1;
}
- if (in->size <= 0)
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_in = NULL;
*buf_out = in;
hb_buffer_t * in = *buf_in;
hb_buffer_t * sub;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_in = NULL;
*buf_out = in;
hb_filter_private_t * pv = filter->private_data;
hb_buffer_t * in = *buf_in, * out;
- if ( in->size <= 0 )
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = in;
*buf_in = NULL;
// following them to preserve the timing (since the packing puts two
// or more frames in what looks like one avi frame). The contents and
// size of these null frames are ignored by the ff_h263_decode_frame
- // as long as they're < 20 bytes. We need a positive size so we use
- // one byte if we're given a zero or negative size. We don't know
- // if the pkt data points anywhere reasonable so we just stick a
- // byte of zero in our outbound buf.
- buf = hb_buffer_init( 1 );
- *buf->data = 0;
+ // as long as they're < 20 bytes. Zero length buffers are also
+ // use by theora to indicate duplicate frames.
+ buf = hb_buffer_init( 0 );
}
else
{
}
if (subtitle->config.dest == PASSTHRUSUB)
{
- hb_fifo_push(subtitle->fifo_out, hb_buffer_init(0));
+ hb_fifo_push(subtitle->fifo_out, hb_buffer_eof_init());
}
}
}
next = *buf_in;
*buf_in = NULL;
- if (next->size == 0)
+ if (next->s.flags & HB_BUF_FLAG_EOF)
{
if (sync->cur != NULL)
{
pv->common->count_frames);
hb_buffer_close(&sync->cur);
hb_buffer_close(&next);
- *buf_out = hb_buffer_init(0);
+ *buf_out = hb_buffer_eof_init();
flushSubtitles(pv);
// Unblock anybody waiting on this threads last PTS
setSyncPTS(pv, INT64_MAX, 0);
sync->cur->s.start);
hb_buffer_close(&sync->cur);
hb_buffer_close( &next );
- *buf_out = hb_buffer_init(0);
+ *buf_out = hb_buffer_eof_init();
flushSubtitles(pv);
// Unblock anybody waiting on this threads last PTS
setSyncPTS(pv, INT64_MAX, 0);
// muxer or renderer filter.
while ( ( sub = hb_fifo_get( subtitle->fifo_raw ) ) != NULL )
{
- if (sub->size > 0)
+ if (!(next->s.flags & HB_BUF_FLAG_EOF))
{
out = sanitizeSubtitle(pv, i, sub);
if (out != NULL)
*buf_in = NULL;
/* if the next buffer is an eof send it downstream */
- if ( buf->size <= 0 )
+ if (buf->s.flags & HB_BUF_FLAG_EOF)
{
*buf_out = buf;
// Unblock anybody waiting on this threads last PTS
if (job->frame_to_stop && pv->common->count_frames >= job->frame_to_stop)
{
hb_buffer_close( &buf );
- *buf_out = hb_buffer_init(0);
+ *buf_out = hb_buffer_eof_init();
// Unblock anybody waiting on this threads last PTS
setSyncPTS(pv, INT64_MAX, sync->index+1);
return HB_WORK_DONE;
if (job->pts_to_stop && sync->next_start >= job->pts_to_stop)
{
hb_buffer_close( &buf );
- *buf_out = hb_buffer_init(0);
+ *buf_out = hb_buffer_eof_init();
// Unblock anybody waiting on this threads last PTS
setSyncPTS(pv, INT64_MAX, sync->index+1);
return HB_WORK_DONE;
*buf_in = NULL;
*buf_out = NULL;
- if( in->size <= 0 )
+
+ if (in->s.flags & HB_BUF_FLAG_EOF)
{
hb_buffer_t *head = NULL, *tail = NULL, *next;
int counter = 2;