diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-05-22 13:42:24 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-05-22 15:30:31 +0200 |
commit | a45cf639e6fb8c86aff91a00970060cd0be401c9 (patch) | |
tree | 321fc0cb192b81be3c03516833f8413260cd1d8d | |
parent | d09321b68e8373435aa98801929c0a5714efd104 (diff) | |
download | ffmpeg-a45cf639e6fb8c86aff91a00970060cd0be401c9.tar.gz |
libavformat/mux: Add ff_choose_chroma_location()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/internal.h | 5 | ||||
-rw-r--r-- | libavformat/mux.c | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h index d665cbdab0..f90df90242 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -411,6 +411,11 @@ enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags); AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precision); /** + * Chooses a timebase for muxing the specified stream. + */ +enum AVChromaLocation ff_choose_chroma_location(AVFormatContext *s, AVStream *st); + +/** * Generate standard extradata for AVC-Intra based on width/height and field * order. */ diff --git a/libavformat/mux.c b/libavformat/mux.c index a39c5347a3..f99dbd9c07 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -115,6 +115,36 @@ AVRational ff_choose_timebase(AVFormatContext *s, AVStream *st, int min_precisio return q; } +enum AVChromaLocation ff_choose_chroma_location(AVFormatContext *s, AVStream *st) +{ + AVCodecContext *avctx = st->codec; + const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(avctx->pix_fmt); + + if (avctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED) + return avctx->chroma_sample_location; + + if (pix_desc) { + if (pix_desc->log2_chroma_h == 0) { + return AVCHROMA_LOC_TOPLEFT; + } else if (pix_desc->log2_chroma_w == 1 && pix_desc->log2_chroma_h == 1) { + if (avctx->field_order == AV_FIELD_UNKNOWN || avctx->field_order == AV_FIELD_PROGRESSIVE) { + switch (avctx->codec_id) { + case AV_CODEC_ID_MJPEG: + case AV_CODEC_ID_MPEG1VIDEO: return AVCHROMA_LOC_CENTER; + } + } + if (avctx->field_order == AV_FIELD_UNKNOWN || avctx->field_order != AV_FIELD_PROGRESSIVE) { + switch (avctx->codec_id) { + case AV_CODEC_ID_MPEG2VIDEO: return AVCHROMA_LOC_LEFT; + } + } + } + } + + return AVCHROMA_LOC_UNSPECIFIED; + +} + int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat, const char *format, const char *filename) { |