static GstFlowReturn theora_dec_decode_buffer (GstTheoraDec * dec, GstBuffer * buf) { ogg_packet packet; GstFlowReturn result = GST_FLOW_OK; /* make ogg_packet out of the buffer */ packet.packet = GST_BUFFER_DATA (buf); packet.bytes = GST_BUFFER_SIZE (buf); packet.granulepos = GST_BUFFER_OFFSET_END (buf); packet.packetno = 0; /* we don't really care */ packet.b_o_s = dec->have_header ? 0 : 1; /* EOS does not matter for the decoder */ packet.e_o_s = 0; if (dec->have_header) { if (packet.granulepos != -1) { dec->granulepos = packet.granulepos; dec->last_timestamp = _theora_granule_start_time (dec, packet.granulepos); } else if (dec->last_timestamp != -1) { dec->last_timestamp = _theora_granule_start_time (dec, dec->granulepos); } if (dec->last_timestamp == -1 && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) dec->last_timestamp = GST_BUFFER_TIMESTAMP (buf); } else { dec->last_timestamp = -1; } GST_DEBUG_OBJECT (dec, "header=%02x packetno=%lld, granule pos=%" G_GINT64_FORMAT ", outtime=%" GST_TIME_FORMAT, packet.bytes ? packet.packet[0] : -1, packet.packetno, packet.granulepos, GST_TIME_ARGS (dec->last_timestamp)); /* switch depending on packet type. A zero byte packet is always a data * packet; we don't dereference it in that case. */ if (packet.bytes && packet.packet[0] & 0x80) { if (dec->have_header) { GST_WARNING_OBJECT (GST_OBJECT (dec), "Ignoring header"); goto done; } result = theora_handle_header_packet (dec, &packet); } else { result = theora_handle_data_packet (dec, &packet, dec->last_timestamp); } done: /* interpolate granule pos */ dec->granulepos = _inc_granulepos (dec, dec->granulepos); return result; }
static GstFlowReturn theora_dec_decode_buffer (GstTheoraDec * dec, GstBuffer * buf, GstVideoCodecFrame * frame) { ogg_packet packet; GstFlowReturn result = GST_FLOW_OK; GstMapInfo minfo; /* make ogg_packet out of the buffer */ gst_buffer_map (buf, &minfo, GST_MAP_READ); packet.packet = minfo.data; packet.bytes = minfo.size; packet.granulepos = -1; packet.packetno = 0; /* we don't really care */ packet.b_o_s = dec->have_header ? 0 : 1; /* EOS does not matter for the decoder */ packet.e_o_s = 0; GST_LOG_OBJECT (dec, "decode buffer of size %ld", packet.bytes); GST_DEBUG_OBJECT (dec, "header=%02x", packet.bytes ? packet.packet[0] : -1); /* switch depending on packet type. A zero byte packet is always a data * packet; we don't dereference it in that case. */ if (packet.bytes && packet.packet[0] & 0x80) { if (dec->have_header) { GST_WARNING_OBJECT (GST_OBJECT (dec), "Ignoring header"); GST_VIDEO_CODEC_FRAME_FLAG_SET (frame, GST_VIDEO_CODEC_FRAME_FLAG_DECODE_ONLY); result = GST_CUSTOM_FLOW_DROP; goto done; } result = theora_handle_header_packet (dec, &packet); /* header packets are not meant to be displayed */ /* FIXME : This is a temporary hack. The proper fix would be to * not call _finish_frame() for these types of packets */ GST_VIDEO_CODEC_FRAME_FLAG_SET (frame, GST_VIDEO_CODEC_FRAME_FLAG_DECODE_ONLY); } else { result = theora_handle_data_packet (dec, &packet, frame); } done: gst_buffer_unmap (buf, &minfo); return result; }
static GstFlowReturn theora_dec_decode_buffer (GstTheoraDec * dec, GstBuffer * buf) { ogg_packet packet; GstFlowReturn result = GST_FLOW_OK; GstClockTime timestamp, duration; /* make ogg_packet out of the buffer */ packet.packet = GST_BUFFER_DATA (buf); packet.bytes = GST_BUFFER_SIZE (buf); packet.granulepos = -1; packet.packetno = 0; /* we don't really care */ packet.b_o_s = dec->have_header ? 0 : 1; /* EOS does not matter for the decoder */ packet.e_o_s = 0; GST_LOG_OBJECT (dec, "decode buffer of size %ld", packet.bytes); /* save last seem timestamp for interpolating the next timestamps using the * framerate when we need to */ timestamp = GST_BUFFER_TIMESTAMP (buf); duration = GST_BUFFER_DURATION (buf); GST_DEBUG_OBJECT (dec, "header=%02x, outtime=%" GST_TIME_FORMAT, packet.bytes ? packet.packet[0] : -1, GST_TIME_ARGS (timestamp)); /* switch depending on packet type. A zero byte packet is always a data * packet; we don't dereference it in that case. */ if (packet.bytes && packet.packet[0] & 0x80) { if (dec->have_header) { GST_WARNING_OBJECT (GST_OBJECT (dec), "Ignoring header"); goto done; } result = theora_handle_header_packet (dec, &packet); } else { result = theora_handle_data_packet (dec, &packet, timestamp, duration); } done: return result; }