parent
2ec5fa999a
commit
787f45edf6
@ -0,0 +1,223 @@
|
|||||||
|
--- gst-libav-1.18.2.old/ext/libav/gstavdemux.c 2021-02-26 16:47:35.842537392 -0800
|
||||||
|
+++ gst-libav-1.18.2.new/ext/libav/gstavdemux.c 2021-02-26 16:47:55.137537967 -0800
|
||||||
|
@@ -41,6 +41,211 @@
|
||||||
|
typedef struct _GstFFMpegDemux GstFFMpegDemux;
|
||||||
|
typedef struct _GstFFStream GstFFStream;
|
||||||
|
|
||||||
|
+typedef struct FFFrac {
|
||||||
|
+ int64_t val, num, den;
|
||||||
|
+} FFFrac;
|
||||||
|
+
|
||||||
|
+struct AVStreamInternal {
|
||||||
|
+ /**
|
||||||
|
+ * Set to 1 if the codec allows reordering, so pts can be different
|
||||||
|
+ * from dts.
|
||||||
|
+ */
|
||||||
|
+ int reorder;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * bitstream filter to run on stream
|
||||||
|
+ * - encoding: Set by muxer using ff_stream_add_bitstream_filter
|
||||||
|
+ * - decoding: unused
|
||||||
|
+ */
|
||||||
|
+ AVBSFContext *bsfc;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Whether or not check_bitstream should still be run on each packet
|
||||||
|
+ */
|
||||||
|
+ int bitstream_checked;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * The codec context used by avformat_find_stream_info, the parser, etc.
|
||||||
|
+ */
|
||||||
|
+ AVCodecContext *avctx;
|
||||||
|
+ /**
|
||||||
|
+ * 1 if avctx has been initialized with the values from the codec parameters
|
||||||
|
+ */
|
||||||
|
+ int avctx_inited;
|
||||||
|
+
|
||||||
|
+ enum AVCodecID orig_codec_id;
|
||||||
|
+
|
||||||
|
+ /* the context for extracting extradata in find_stream_info()
|
||||||
|
+ * inited=1/bsf=NULL signals that extracting is not possible (codec not
|
||||||
|
+ * supported) */
|
||||||
|
+ struct {
|
||||||
|
+ AVBSFContext *bsf;
|
||||||
|
+ AVPacket *pkt;
|
||||||
|
+ int inited;
|
||||||
|
+ } extract_extradata;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
|
||||||
|
+ */
|
||||||
|
+ int need_context_update;
|
||||||
|
+
|
||||||
|
+ int is_intra_only;
|
||||||
|
+
|
||||||
|
+ FFFrac *priv_pts;
|
||||||
|
+
|
||||||
|
+#define MAX_STD_TIMEBASES (30*12+30+3+6)
|
||||||
|
+ /**
|
||||||
|
+ * Stream information used internally by avformat_find_stream_info()
|
||||||
|
+ */
|
||||||
|
+ struct {
|
||||||
|
+ int64_t last_dts;
|
||||||
|
+ int64_t duration_gcd;
|
||||||
|
+ int duration_count;
|
||||||
|
+ int64_t rfps_duration_sum;
|
||||||
|
+ double (*duration_error)[2][MAX_STD_TIMEBASES];
|
||||||
|
+ int64_t codec_info_duration;
|
||||||
|
+ int64_t codec_info_duration_fields;
|
||||||
|
+ int frame_delay_evidence;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * 0 -> decoder has not been searched for yet.
|
||||||
|
+ * >0 -> decoder found
|
||||||
|
+ * <0 -> decoder with codec_id == -found_decoder has not been found
|
||||||
|
+ */
|
||||||
|
+ int found_decoder;
|
||||||
|
+
|
||||||
|
+ int64_t last_duration;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Those are used for average framerate estimation.
|
||||||
|
+ */
|
||||||
|
+ int64_t fps_first_dts;
|
||||||
|
+ int fps_first_dts_idx;
|
||||||
|
+ int64_t fps_last_dts;
|
||||||
|
+ int fps_last_dts_idx;
|
||||||
|
+
|
||||||
|
+ } *info;
|
||||||
|
+
|
||||||
|
+ AVIndexEntry *index_entries; /**< Only used if the format does not
|
||||||
|
+ support seeking natively. */
|
||||||
|
+ int nb_index_entries;
|
||||||
|
+ unsigned int index_entries_allocated_size;
|
||||||
|
+
|
||||||
|
+ int64_t interleaver_chunk_size;
|
||||||
|
+ int64_t interleaver_chunk_duration;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * stream probing state
|
||||||
|
+ * -1 -> probing finished
|
||||||
|
+ * 0 -> no probing requested
|
||||||
|
+ * rest -> perform probing with request_probe being the minimum score to accept.
|
||||||
|
+ */
|
||||||
|
+ int request_probe;
|
||||||
|
+ /**
|
||||||
|
+ * Indicates that everything up to the next keyframe
|
||||||
|
+ * should be discarded.
|
||||||
|
+ */
|
||||||
|
+ int skip_to_keyframe;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Number of samples to skip at the start of the frame decoded from the next packet.
|
||||||
|
+ */
|
||||||
|
+ int skip_samples;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * If not 0, the number of samples that should be skipped from the start of
|
||||||
|
+ * the stream (the samples are removed from packets with pts==0, which also
|
||||||
|
+ * assumes negative timestamps do not happen).
|
||||||
|
+ * Intended for use with formats such as mp3 with ad-hoc gapless audio
|
||||||
|
+ * support.
|
||||||
|
+ */
|
||||||
|
+ int64_t start_skip_samples;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * If not 0, the first audio sample that should be discarded from the stream.
|
||||||
|
+ * This is broken by design (needs global sample count), but can't be
|
||||||
|
+ * avoided for broken by design formats such as mp3 with ad-hoc gapless
|
||||||
|
+ * audio support.
|
||||||
|
+ */
|
||||||
|
+ int64_t first_discard_sample;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * The sample after last sample that is intended to be discarded after
|
||||||
|
+ * first_discard_sample. Works on frame boundaries only. Used to prevent
|
||||||
|
+ * early EOF if the gapless info is broken (considered concatenated mp3s).
|
||||||
|
+ */
|
||||||
|
+ int64_t last_discard_sample;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Number of internally decoded frames, used internally in libavformat, do not access
|
||||||
|
+ * its lifetime differs from info which is why it is not in that structure.
|
||||||
|
+ */
|
||||||
|
+ int nb_decoded_frames;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Timestamp offset added to timestamps before muxing
|
||||||
|
+ */
|
||||||
|
+ int64_t mux_ts_offset;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Internal data to check for wrapping of the time stamp
|
||||||
|
+ */
|
||||||
|
+ int64_t pts_wrap_reference;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Options for behavior, when a wrap is detected.
|
||||||
|
+ *
|
||||||
|
+ * Defined by AV_PTS_WRAP_ values.
|
||||||
|
+ *
|
||||||
|
+ * If correction is enabled, there are two possibilities:
|
||||||
|
+ * If the first time stamp is near the wrap point, the wrap offset
|
||||||
|
+ * will be subtracted, which will create negative time stamps.
|
||||||
|
+ * Otherwise the offset will be added.
|
||||||
|
+ */
|
||||||
|
+ int pts_wrap_behavior;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Internal data to prevent doing update_initial_durations() twice
|
||||||
|
+ */
|
||||||
|
+ int update_initial_durations_done;
|
||||||
|
+
|
||||||
|
+#define MAX_REORDER_DELAY 16
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Internal data to generate dts from pts
|
||||||
|
+ */
|
||||||
|
+ int64_t pts_reorder_error[MAX_REORDER_DELAY+1];
|
||||||
|
+ uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1];
|
||||||
|
+
|
||||||
|
+ int64_t pts_buffer[MAX_REORDER_DELAY+1];
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Internal data to analyze DTS and detect faulty mpeg streams
|
||||||
|
+ */
|
||||||
|
+ int64_t last_dts_for_order_check;
|
||||||
|
+ uint8_t dts_ordered;
|
||||||
|
+ uint8_t dts_misordered;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Internal data to inject global side data
|
||||||
|
+ */
|
||||||
|
+ int inject_global_side_data;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * display aspect ratio (0 if unknown)
|
||||||
|
+ * - encoding: unused
|
||||||
|
+ * - decoding: Set by libavformat to calculate sample_aspect_ratio internally
|
||||||
|
+ */
|
||||||
|
+ AVRational display_aspect_ratio;
|
||||||
|
+
|
||||||
|
+ AVProbeData probe_data;
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * last packet in packet_buffer for this stream when muxing.
|
||||||
|
+ */
|
||||||
|
+ struct AVPacketList *last_in_packet_buffer;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
struct _GstFFStream
|
||||||
|
{
|
||||||
|
GstPad *pad;
|
||||||
|
@@ -483,7 +688,7 @@ gst_ffmpegdemux_do_seek (GstFFMpegDemux
|
||||||
|
GST_LOG_OBJECT (demux, "keyframeidx: %d", keyframeidx);
|
||||||
|
|
||||||
|
if (keyframeidx >= 0) {
|
||||||
|
- fftarget = stream->index_entries[keyframeidx].timestamp;
|
||||||
|
+ fftarget = stream->internal->index_entries[keyframeidx].timestamp;
|
||||||
|
target = gst_ffmpeg_time_ff_to_gst (fftarget, stream->time_base);
|
||||||
|
|
||||||
|
GST_LOG_OBJECT (demux,
|
Loading…
Reference in new issue