GstH264PPS pps;
GstH264SliceHdr slice_hdr;
} data;
+ guint state;
};
static inline const GstVaapiMiniObjectClass *
if (!fill_picture(decoder, picture, pi))
return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
- priv->decoder_state = priv->parser_state & (
- GST_H264_VIDEO_STATE_GOT_SPS |
- GST_H264_VIDEO_STATE_GOT_PPS);
+ priv->decoder_state = pi->state;
return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
GST_DEBUG("slice (%u bytes)", pi->nalu.size);
- if (!is_valid_state(priv->decoder_state,
+ if (!is_valid_state(pi->state,
GST_H264_VIDEO_STATE_VALID_PICTURE_HEADERS)) {
GST_WARNING("failed to receive enough headers to decode slice");
return GST_VAAPI_DECODER_STATUS_SUCCESS;
static GstVaapiDecoderStatus
decode_unit(GstVaapiDecoderH264 *decoder, GstVaapiDecoderUnit *unit)
{
+ GstVaapiDecoderH264Private * const priv = &decoder->priv;
GstVaapiParserInfoH264 * const pi = unit->parsed_info;
GstVaapiDecoderStatus status;
+ priv->decoder_state |= pi->state;
switch (pi->nalu.type) {
case GST_H264_NAL_SLICE_IDR:
/* fall-through. IDR specifics are handled in init_picture() */
GST_VAAPI_DECODER_UNIT_FLAG_SET(unit, flags);
pi->nalu.data = NULL;
+ pi->state = priv->parser_state;
return GST_VAAPI_DECODER_STATUS_SUCCESS;
}