diff options
author | Thierry Foucu <tfoucu@gmail.com> | 2009-02-13 21:36:36 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-02-13 21:36:36 +0000 |
commit | 2ead1eb0ff117646ec23e8d2ba5cf971556d8c13 (patch) | |
tree | 264e8154ebc13af23a80499133158395e2032ede | |
parent | 032d8aece23a032fa373c19a7557614638c97433 (diff) | |
download | ffmpeg-streaming-2ead1eb0ff117646ec23e8d2ba5cf971556d8c13.zip ffmpeg-streaming-2ead1eb0ff117646ec23e8d2ba5cf971556d8c13.tar.gz |
use correct field number for video according to specs, patch by Thierry Foucu, tfoucu at gmail dot com
Originally committed as revision 17214 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/gxfenc.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/libavformat/gxfenc.c b/libavformat/gxfenc.c index 90605e1..ca7b0c7 100644 --- a/libavformat/gxfenc.c +++ b/libavformat/gxfenc.c @@ -728,11 +728,19 @@ static int gxf_parse_mpeg_frame(GXFStreamContext *sc, const uint8_t *buf, int si static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt, int size) { GXFStreamContext *sc = ctx->fc->streams[pkt->stream_index]->priv_data; - int64_t dts = av_rescale_rnd(pkt->dts, ctx->sample_rate, sc->codec->time_base.den, AV_ROUND_UP); + unsigned field_nb; + /* If the video is frame-encoded, the frame numbers shall be represented by + * even field numbers. + * see SMPTE360M-2004 6.4.2.1.3 Media field number */ + if (sc->codec->codec_type == CODEC_TYPE_VIDEO) { + field_nb = ctx->nb_fields; + } else { + field_nb = av_rescale_rnd(pkt->dts, ctx->sample_rate, sc->codec->time_base.den, AV_ROUND_UP); + } put_byte(pb, sc->media_type); put_byte(pb, sc->index); - put_be32(pb, dts); + put_be32(pb, field_nb); if (sc->codec->codec_type == CODEC_TYPE_AUDIO) { put_be16(pb, 0); put_be16(pb, size / 2); @@ -754,7 +762,7 @@ static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket put_be24(pb, 0); } else put_be32(pb, size); - put_be32(pb, dts); + put_be32(pb, field_nb); put_byte(pb, 1); /* flags */ put_byte(pb, 0); /* reserved */ return 16; |