static void feed_textbuf (GstSubParse * self, GstBuffer * buf) { gboolean discont; discont = GST_BUFFER_IS_DISCONT (buf); if (GST_BUFFER_OFFSET_IS_VALID (buf) && GST_BUFFER_OFFSET (buf) != self->offset) { self->offset = GST_BUFFER_OFFSET (buf); discont = TRUE; } if (discont) { GST_INFO ("discontinuity"); /* flush the parser state */ parser_state_init (&self->state); g_string_truncate (self->textbuf, 0); sami_context_reset (&self->state); /* we could set a flag to make sure that the next buffer we push out also * has the DISCONT flag set, but there's no point really given that it's * subtitles which are discontinuous by nature. */ } self->textbuf = g_string_append_len (self->textbuf, (gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); self->offset = GST_BUFFER_OFFSET (buf) + GST_BUFFER_SIZE (buf); self->next_offset = self->offset; gst_buffer_unref (buf); }
/*Glue to make sure the types match up*/ parse_result parse(lex_result in) { parse_result result; result.names = in.names; result.AST = parse_blocklines(parser_state_init(in.program, 0)).tree; result.file = in.file; lexid_dynarray_free(in.program); return result; }
static GstCaps * gst_sub_parse_format_autodetect (GstSubParse * self) { gchar *data; GstSubParseFormat format; if (strlen (self->textbuf->str) < 35) { GST_DEBUG ("File too small to be a subtitles file"); return NULL; } data = g_strndup (self->textbuf->str, 35); format = gst_sub_parse_data_format_autodetect (data); g_free (data); self->parser_type = format; parser_state_init (&self->state); switch (format) { case GST_SUB_PARSE_FORMAT_MDVDSUB: self->parse_line = parse_mdvdsub; return gst_caps_new_simple ("text/x-pango-markup", NULL); case GST_SUB_PARSE_FORMAT_SUBRIP: self->parse_line = parse_subrip; return gst_caps_new_simple ("text/x-pango-markup", NULL); case GST_SUB_PARSE_FORMAT_MPSUB: self->parse_line = parse_mpsub; return gst_caps_new_simple ("text/plain", NULL); case GST_SUB_PARSE_FORMAT_SAMI: self->parse_line = parse_sami; sami_context_init (&self->state); return gst_caps_new_simple ("text/x-pango-markup", NULL); case GST_SUB_PARSE_FORMAT_TMPLAYER: self->parse_line = parse_tmplayer; self->state.max_duration = 5 * GST_SECOND; return gst_caps_new_simple ("text/plain", NULL); case GST_SUB_PARSE_FORMAT_MPL2: self->parse_line = parse_mpl2; return gst_caps_new_simple ("text/x-pango-markup", NULL); case GST_SUB_PARSE_FORMAT_SUBVIEWER: self->parse_line = parse_subviewer; return gst_caps_new_simple ("text/plain", NULL); case GST_SUB_PARSE_FORMAT_UNKNOWN: default: GST_DEBUG ("no subtitle format detected"); GST_ELEMENT_ERROR (self, STREAM, WRONG_TYPE, ("The input is not a valid/supported subtitle file"), (NULL)); return NULL; } }
static gboolean gst_vaapi_decoder_init (GstVaapiDecoder * decoder, GstVaapiDisplay * display, GstCaps * caps) { const GstVaapiDecoderClass *const klass = GST_VAAPI_DECODER_GET_CLASS (decoder); GstVideoCodecState *codec_state; guint sub_size; parser_state_init (&decoder->parser_state); codec_state = g_slice_new0 (GstVideoCodecState); codec_state->ref_count = 1; gst_video_info_init (&codec_state->info); decoder->user_data = NULL; decoder->display = gst_vaapi_display_ref (display); decoder->va_display = GST_VAAPI_DISPLAY_VADISPLAY (display); decoder->context = NULL; decoder->va_context = VA_INVALID_ID; decoder->codec = 0; decoder->codec_state = codec_state; decoder->codec_state_changed_func = NULL; decoder->codec_state_changed_data = NULL; decoder->buffers = g_async_queue_new_full ((GDestroyNotify) gst_buffer_unref); decoder->frames = g_async_queue_new_full ((GDestroyNotify) gst_video_codec_frame_unref); if (!set_caps (decoder, caps)) return FALSE; sub_size = GST_VAAPI_MINI_OBJECT_CLASS (klass)->size - sizeof (*decoder); if (sub_size > 0) memset (((guchar *) decoder) + sizeof (*decoder), 0, sub_size); if (klass->create && !klass->create (decoder)) return FALSE; return TRUE; }
/*consumes one token from the stream*/ parser_state consume(lexid toconsume, parser_state in) { if (lexid_eq(toconsume, getCurrent(in))) { return parser_state_init(in.program, in.index + 1); } return in; //TODO: throw an error! }