示例#1
0
static gboolean
gst_vdp_mpeg_dec_parse_picture (GstVdpMpegDec * mpeg_dec, GstBuffer * buffer)
{
    MPEGPictureHdr pic_hdr;

    if (!mpeg_util_parse_picture_hdr (&pic_hdr, buffer))
        return FALSE;

    if (pic_hdr.pic_type != I_FRAME
            && mpeg_dec->vdp_info.backward_reference == VDP_INVALID_HANDLE) {
        GST_DEBUG_OBJECT (mpeg_dec,
                          "Drop frame since we haven't got an I_FRAME yet");
        return FALSE;
    }
    if (pic_hdr.pic_type == B_FRAME
            && mpeg_dec->vdp_info.forward_reference == VDP_INVALID_HANDLE) {
        GST_DEBUG_OBJECT (mpeg_dec,
                          "Drop frame since we haven't got two non B_FRAMES yet");
        return FALSE;
    }

    mpeg_dec->vdp_info.picture_coding_type = pic_hdr.pic_type;

    if (mpeg_dec->version == 1) {
        mpeg_dec->vdp_info.full_pel_forward_vector =
            pic_hdr.full_pel_forward_vector;
        mpeg_dec->vdp_info.full_pel_backward_vector =
            pic_hdr.full_pel_backward_vector;
        memcpy (&mpeg_dec->vdp_info.f_code, &pic_hdr.f_code, 4);
    }

    mpeg_dec->frame_nr = mpeg_dec->gop_frame + pic_hdr.tsn;

    return TRUE;
}
static gboolean
gst_vdp_mpeg_dec_handle_picture (GstVdpMpegDec * mpeg_dec, GstBuffer * buffer)
{
  MPEGPictureHdr pic_hdr;

  if (!mpeg_util_parse_picture_hdr (&pic_hdr, buffer))
    return FALSE;

  mpeg_dec->vdp_info.picture_coding_type = pic_hdr.pic_type;

  if (mpeg_dec->stream_info.version == 1) {
    mpeg_dec->vdp_info.full_pel_forward_vector =
        pic_hdr.full_pel_forward_vector;
    mpeg_dec->vdp_info.full_pel_backward_vector =
        pic_hdr.full_pel_backward_vector;
    memcpy (&mpeg_dec->vdp_info.f_code, &pic_hdr.f_code, 4);
  }

  mpeg_dec->frame_nr = mpeg_dec->gop_frame + pic_hdr.tsn;

  return TRUE;
}