summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-05-22 13:42:24 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-05-22 15:30:31 +0200
commita45cf639e6fb8c86aff91a00970060cd0be401c9 (patch)
tree321fc0cb192b81be3c03516833f8413260cd1d8d
parentd09321b68e8373435aa98801929c0a5714efd104 (diff)
libavformat/mux: Add ff_choose_chroma_location()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/internal.h5
-rw-r--r--libavformat/mux.c30
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)
{