]> git.sesse.net Git - vlc/commitdiff
mmal/codec: Set progressive flag on frames
authorJulian Scheel <julian@jusst.de>
Thu, 9 Oct 2014 14:52:14 +0000 (16:52 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Thu, 9 Oct 2014 15:57:39 +0000 (17:57 +0200)
Query the interlace type from the mmal decoder on format change and pass it
through to vlc_pictures.

Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/hw/mmal/codec.c

index 73757a3eee7ada36071176e566afbbf6a66eff2c..26e03e1c08072fa446949bf0bdd17752bbeb8f4e 100644 (file)
@@ -75,6 +75,9 @@ struct decoder_sys_t {
     MMAL_ES_FORMAT_T *output_format;
     MMAL_QUEUE_T *decoded_pictures;
     vlc_mutex_t mutex;
+
+    bool b_top_field_first;
+    bool b_progressive;
 };
 
 /* Utilities */
@@ -290,6 +293,7 @@ static void CloseDecoder(decoder_t *dec)
 
 static int change_output_format(decoder_t *dec)
 {
+    MMAL_PARAMETER_VIDEO_INTERLACE_TYPE_T interlace_type;
     decoder_sys_t *sys = dec->p_sys;
     MMAL_STATUS_T status;
     int pool_size;
@@ -360,6 +364,19 @@ static int change_output_format(decoder_t *dec)
     dec->fmt_out.video.i_frame_rate = sys->output->format->es->video.frame_rate.num;
     dec->fmt_out.video.i_frame_rate_base = sys->output->format->es->video.frame_rate.den;
 
+    /* Query interlaced type */
+    interlace_type.hdr.id = MMAL_PARAMETER_VIDEO_INTERLACE_TYPE;
+    interlace_type.hdr.size = sizeof(MMAL_PARAMETER_VIDEO_INTERLACE_TYPE_T);
+    status = mmal_port_parameter_get(sys->output, &interlace_type.hdr);
+    if (status != MMAL_SUCCESS) {
+        msg_Warn(dec, "Failed to query interlace type from decoder output port (status=%"PRIx32" %s)",
+                status, mmal_status_to_string(status));
+    } else {
+        sys->b_progressive = (interlace_type.eMode == MMAL_InterlaceProgressive);
+        sys->b_top_field_first = sys->b_progressive ?
+            (interlace_type.eMode == MMAL_InterlaceFieldsInterleavedUpperFirst) : false;
+        msg_Dbg(dec, "Detected %s video", sys->b_progressive ? "progressive" : "interlaced");
+    }
 
 out:
     mmal_format_free(sys->output_format);
@@ -474,6 +491,8 @@ static picture_t *decode(decoder_t *dec, block_t **pblock)
         if (buffer) {
             ret = (picture_t *)buffer->user_data;
             ret->date = buffer->pts;
+            ret->b_progressive = sys->b_progressive;
+            ret->b_top_field_first = sys->b_top_field_first;
 
             mmal_buffer_header_reset(buffer);
             mmal_buffer_header_release(buffer);