static int get_frame_type(int type)
{
- switch(type)
+ switch (type)
{
- case AV_PICTURE_TYPE_I:
- return HB_FRAME_I;
case AV_PICTURE_TYPE_B:
return HB_FRAME_B;
+
+ case AV_PICTURE_TYPE_S:
case AV_PICTURE_TYPE_P:
+ case AV_PICTURE_TYPE_SP:
return HB_FRAME_P;
+
+ case AV_PICTURE_TYPE_BI:
+ case AV_PICTURE_TYPE_SI:
+ case AV_PICTURE_TYPE_I:
+ default:
+ return HB_FRAME_I;
}
- return 0;
}
/*
static uint8_t convert_pict_type( int pict_type, char pkt_flag_key, uint16_t* sflags )
{
+ uint16_t flags = 0;
uint8_t retval = 0;
- switch ( pict_type )
+ switch (pict_type)
{
- case AV_PICTURE_TYPE_P:
- {
- retval = HB_FRAME_P;
- } break;
-
case AV_PICTURE_TYPE_B:
- {
retval = HB_FRAME_B;
- } break;
+ break;
case AV_PICTURE_TYPE_S:
- {
- retval = HB_FRAME_P;
- } break;
-
+ case AV_PICTURE_TYPE_P:
case AV_PICTURE_TYPE_SP:
- {
retval = HB_FRAME_P;
- } break;
+ break;
+
case AV_PICTURE_TYPE_BI:
case AV_PICTURE_TYPE_SI:
case AV_PICTURE_TYPE_I:
- {
- *sflags |= HB_FRAME_REF;
- if ( pkt_flag_key )
- {
- retval = HB_FRAME_IDR;
- }
- else
- {
- retval = HB_FRAME_I;
- }
- } break;
-
default:
{
- if ( pkt_flag_key )
- {
- //buf->s.flags |= HB_FRAME_REF;
- *sflags |= HB_FRAME_REF;
- retval = HB_FRAME_KEY;
- }
- else
- {
- retval = HB_FRAME_REF;
- }
+ flags |= HB_FLAG_FRAMETYPE_REF;
+ retval = HB_FRAME_I;
} break;
}
+ if (pkt_flag_key)
+ {
+ flags |= HB_FLAG_FRAMETYPE_REF;
+ flags |= HB_FLAG_FRAMETYPE_KEY;
+ }
+ *sflags = flags;
return retval;
}
buf->s.start = get_frame_start( pv, frameno );
buf->s.duration = get_frame_duration( pv, frameno );
buf->s.stop = buf->s.stop + buf->s.duration;
- buf->s.flags &= ~HB_FRAME_REF;
buf->s.frametype = convert_pict_type( pv->context->coded_frame->pict_type, pkt.flags & AV_PKT_FLAG_KEY, &buf->s.flags );
- if (buf->s.frametype & HB_FRAME_KEY)
+ if (buf->s.flags & HB_FLAG_FRAMETYPE_KEY)
{
hb_chapter_dequeue(pv->chapter_queue, buf);
}
buf->f.fmt = AV_PIX_FMT_YUV420P;
buf->f.width = frame_width;
buf->f.height = frame_height;
- buf->s.frametype = ( th_packet_iskeyframe(&op) ) ? HB_FRAME_KEY : HB_FRAME_REF;
+ buf->s.flags = HB_FLAG_FRAMETYPE_REF;
+ buf->s.frametype = HB_FRAME_I;
+ if (th_packet_iskeyframe(&op))
+ {
+ buf->s.flags |= HB_FLAG_FRAMETYPE_KEY;
+ }
buf->s.start = in->s.start;
buf->s.stop = in->s.stop;
buf->s.duration = in->s.stop - in->s.start;
w->config->h264.init_delay = -pic_out->i_dts;
}
- /* Decide what type of frame we have. */
- switch( pic_out->i_type )
+ /* Determine what type of frame we have. */
+ switch (pic_out->i_type)
{
case X264_TYPE_IDR:
- // Handled in b_keyframe check below.
- break;
-
- case X264_TYPE_I:
- buf->s.frametype = HB_FRAME_I;
+ buf->s.frametype = HB_FRAME_IDR;
break;
case X264_TYPE_P:
buf->s.frametype = HB_FRAME_B;
break;
- /* This is for b-pyramid, which has reference b-frames
- However, it doesn't seem to ever be used... */
case X264_TYPE_BREF:
buf->s.frametype = HB_FRAME_BREF;
break;
- // If it isn't the above, what type of frame is it??
+ case X264_TYPE_I:
default:
- buf->s.frametype = 0;
+ buf->s.frametype = HB_FRAME_I;
break;
}
+ buf->s.flags = 0;
- // PIR has no IDR frames, but x264 marks recovery points
- // as keyframes. So fake an IDR at these points. This flag
- // is also set for real IDR frames.
if (pic_out->b_keyframe)
{
- buf->s.frametype = HB_FRAME_IDR;
+ buf->s.flags |= HB_FLAG_FRAMETYPE_KEY;
/* if we have a chapter marker pending and this
frame's presentation time stamp is at or after
the marker's time stamp, use this as the
break;
}
- /* Since libx264 doesn't tell us when b-frames are
- themselves reference frames, figure it out on our own. */
- if( (buf->s.frametype == HB_FRAME_B) &&
- (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
- buf->s.frametype = HB_FRAME_BREF;
-
- /* Expose disposable bit to muxer. */
- if( nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE )
- buf->s.flags &= ~HB_FRAME_REF;
+ /*
+ * Expose disposable bit to muxer.
+ *
+ * Also, since libx264 doesn't tell us when B-frames are
+ * themselves reference frames, figure it out on our own.
+ */
+ if (nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE)
+ {
+ buf->s.flags &= ~HB_FLAG_FRAMETYPE_REF;
+ }
else
- buf->s.flags |= HB_FRAME_REF;
+ {
+ if (buf->s.frametype == HB_FRAME_B)
+ {
+ buf->s.frametype = HB_FRAME_BREF;
+ }
+ buf->s.flags |= HB_FLAG_FRAMETYPE_REF;
+ }
buf->size += size;
}
{
return NULL;
}
-
+ buf->s.flags = 0;
buf->size = 0;
+
// copy the bitstream data
for (i = 0; i < nnal; i++)
{
switch (pic_out->sliceType)
{
case X265_TYPE_IDR:
+ buf->s.flags |= HB_FLAG_FRAMETYPE_REF;
+ buf->s.flags |= HB_FLAG_FRAMETYPE_KEY;
buf->s.frametype = HB_FRAME_IDR;
break;
- case X265_TYPE_I:
- buf->s.frametype = HB_FRAME_I;
- break;
case X265_TYPE_P:
buf->s.frametype = HB_FRAME_P;
break;
case X265_TYPE_BREF:
buf->s.frametype = HB_FRAME_BREF;
break;
+ case X265_TYPE_I:
default:
- buf->s.frametype = 0;
+ buf->s.frametype = HB_FRAME_I;
break;
}
- if (pic_out->sliceType == X265_TYPE_IDR)
+ if (buf->s.flags & HB_FLAG_FRAMETYPE_KEY)
{
hb_chapter_dequeue(pv->chapter_queue, buf);
}
pkt.pts = pts;
pkt.duration = duration;
- if (track->type == MUX_TYPE_VIDEO && ((job->vcodec & HB_VCODEC_H264_MASK) ||
- (job->vcodec & HB_VCODEC_H265_MASK) ||
- (job->vcodec & HB_VCODEC_FFMPEG_MASK)))
+ if (track->type == MUX_TYPE_VIDEO)
{
- if (buf->s.frametype == HB_FRAME_IDR)
+ if ((buf->s.frametype == HB_FRAME_IDR) ||
+ (buf->s.flags & HB_FLAG_FRAMETYPE_KEY))
+ {
pkt.flags |= AV_PKT_FLAG_KEY;
+ }
}
else if (buf->s.frametype & HB_FRAME_KEY)
{
uint16_t flags = 0;
uint8_t frametype = 0;
- if (qsv_frametype & MFX_FRAMETYPE_IDR)
+ if (qsv_frametype & MFX_FRAMETYPE_IDR)
{
+ flags |= HB_FLAG_FRAMETYPE_KEY;
frametype = HB_FRAME_IDR;
}
else if (qsv_frametype & MFX_FRAMETYPE_I)
if (qsv_frametype & MFX_FRAMETYPE_REF)
{
- flags |= HB_FRAME_REF;
+ flags |= HB_FLAG_FRAMETYPE_REF;
}
if (out_flags != NULL)
* libav avcodec_decode_video2() needs AVPacket flagged with AV_PKT_FLAG_KEY
* for some codecs. For example, sequence of PNG in a mov container.
*/
- if ( stream->ffmpeg_pkt->flags & AV_PKT_FLAG_KEY )
+ if (stream->ffmpeg_pkt->flags & AV_PKT_FLAG_KEY)
{
- buf->s.frametype |= HB_FRAME_KEY;
+ buf->s.flags = HB_FLAG_FRAMETYPE_KEY;
+ buf->s.frametype = HB_FRAME_I;
}
break;