On Mon, 15 Apr 2013 12:55:33 +0200, Luca Barbato <[email protected]> wrote:
> Most formats do not support negative timestamps, shift them to avoid
> unexpected behaviour and a number of bad crashes.
>
> Signed-off-by: Anton Khirnov <[email protected]>
> Signed-off-by: Luca Barbato <[email protected]>
> ---
>
> mkv should not use negative timestamps even if the are feasible.
>
> libavformat/avformat.h | 17 +++++++++++++++
> libavformat/ffmenc.c | 1 +
> libavformat/framecrcenc.c | 3 ++-
> libavformat/md5enc.c | 3 ++-
> libavformat/mux.c | 25 +++++++++++++++++++---
> libavformat/oggenc.c | 1 +
> tests/ref/lavf/asf | 4 ++--
> tests/ref/lavf/mkv | 2 +-
> tests/ref/lavf/mpg | 2 +-
> tests/ref/lavf/ts | 2 +-
> tests/ref/seek/lavf-asf | 54
> +++++++++++++++++++++++------------------------
> tests/ref/seek/lavf-mkv | 44 +++++++++++++++++++-------------------
> tests/ref/seek/lavf-mpg | 54
> +++++++++++++++++++++++------------------------
> tests/ref/seek/lavf-ts | 54
> +++++++++++++++++++++++------------------------
> 14 files changed, 153 insertions(+), 113 deletions(-)
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 067a787..2512e36 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -360,6 +360,11 @@ typedef struct AVProbeData {
> #define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly
> increasing timestamps, but they must
> still be monotonic */
> +#define AVFMT_TS_NEGATIVE 0x40000 /**< Format allows muxing negative
> + timestamps. If not set the timestamp
> + will be shifted in av_write_frame and
> + av_interleaved_write_frame so they
> + start from 0. */
>
Nit, I'd put this above the #define
> /**
> * @addtogroup lavf_encoding
> @@ -1021,6 +1026,18 @@ typedef struct AVFormatContext {
> */
> #define RAW_PACKET_BUFFER_SIZE 2500000
> int raw_packet_buffer_remaining_size;
> +
> + /**
> + * Offset to remap timestamps to be non-negative.
> + * Expressed in timebase units.
> + */
> + int64_t offset;
> +
> + /**
> + * Timebase for the timestamp offset.
> + */
> + AVRational offset_timebase;
> +
> } AVFormatContext;
>
> typedef struct AVPacketList {
> diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c
> index 386487f..91658e1 100644
> --- a/libavformat/ffmenc.c
> +++ b/libavformat/ffmenc.c
> @@ -245,4 +245,5 @@ AVOutputFormat ff_ffm_muxer = {
> .write_header = ffm_write_header,
> .write_packet = ffm_write_packet,
> .write_trailer = ffm_write_trailer,
> + .flags = AVFMT_TS_NEGATIVE,
> };
> diff --git a/libavformat/framecrcenc.c b/libavformat/framecrcenc.c
> index de6fa2b..fed0cca 100644
> --- a/libavformat/framecrcenc.c
> +++ b/libavformat/framecrcenc.c
> @@ -43,5 +43,6 @@ AVOutputFormat ff_framecrc_muxer = {
> .video_codec = AV_CODEC_ID_RAWVIDEO,
> .write_header = ff_framehash_write_header,
> .write_packet = framecrc_write_packet,
> - .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
> + .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
> + AVFMT_TS_NEGATIVE,
> };
> diff --git a/libavformat/md5enc.c b/libavformat/md5enc.c
> index 16412c9..9249704 100644
> --- a/libavformat/md5enc.c
> +++ b/libavformat/md5enc.c
> @@ -127,6 +127,7 @@ AVOutputFormat ff_framemd5_muxer = {
> .write_header = framemd5_write_header,
> .write_packet = framemd5_write_packet,
> .write_trailer = framemd5_write_trailer,
> - .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT,
> + .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
> + AVFMT_TS_NEGATIVE,
> };
> #endif
> diff --git a/libavformat/mux.c b/libavformat/mux.c
> index 76b0fb4..32aa830 100644
> --- a/libavformat/mux.c
> +++ b/libavformat/mux.c
> @@ -391,6 +391,25 @@ static int compute_pkt_fields2(AVFormatContext *s,
> AVStream *st, AVPacket *pkt)
> return 0;
> }
>
> +static int write_packet(AVFormatContext *s, AVPacket *pkt)
> +{
> + if (!(s->oformat->flags & (AVFMT_TS_NEGATIVE | AVFMT_NOTIMESTAMPS))) {
This would be safer with some checks for AV_NOPTS_VALUE
Otherwise i think it's good.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel