[PORT FROM R2] atomisp: first frame of output video binary is bad
authorLokesh Gupta <lokesh.gupta@intel.com>
Fri, 4 Nov 2011 11:57:36 +0000 (12:57 +0100)
committerbuildbot <buildbot@intel.com>
Mon, 19 Dec 2011 13:29:37 +0000 (05:29 -0800)
BZ: 17272

The first frame from video binary is always bad because video
binary has a two stage pipeline. With this patch, the CSS layer
informs the driver layer about an invalid frame using the
interrupt info

Change-Id: I1beb51fc9de8cf02522e9a84aa1badbc04e0ab95
Orig-Change-Id: Ic7d7e9119f04d9fa1555d812e954ed250905ef8b
Signed-off-by: Lokesh Gupta <lokesh.gupta@intel.com>
Reviewed-on: http://android.intel.com:8080/23187
Reviewed-by: Cohen, David A <david.a.cohen@intel.com>
Reviewed-by: Tao, Jing <jing.tao@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Reviewed-on: http://android.intel.com:8080/28001
Reviewed-by: Tuominen, TeemuX <teemux.tuominen@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
drivers/media/video/atomisp/css/sh_css.c
drivers/media/video/atomisp/css/sh_css_types.h

index 18e2b9e..0bd7662 100644 (file)
@@ -197,6 +197,7 @@ struct sh_css_video_settings {
        struct sh_css_pipeline pipeline;
        struct sh_css_shading_table *shading_table;
        bool zoom_changed;
+       bool invalid_first_frame;
 };
 
 #define DEFAULT_VIDEO_SETTINGS \
@@ -1893,10 +1894,18 @@ sh_css_translate_interrupt(unsigned int *irq_infos)
                switch (irq) {
                case hrt_isp_css_irq_sp:
                        sh_css_hrt_irq_clear_sp();
-                       if (sh_css_frame_done())
+                       if (sh_css_frame_done()) {
                                infos |= SH_CSS_IRQ_INFO_FRAME_DONE;
-                       else
+                               if (my_css.mode == sh_css_mode_video &&
+                                   my_css.video_settings.invalid_first_frame) {
+                                       infos |=
+                                         SH_CSS_IRQ_INFO_INVALID_FIRST_FRAME;
+                                       my_css.video_settings.
+                                               invalid_first_frame = false;
+                               }
+                       } else {
                                infos |= SH_CSS_IRQ_INFO_START_NEXT_STAGE;
+                       }
                        if (sh_css_statistics_ready())
                                infos |= SH_CSS_IRQ_INFO_STATISTICS_READY;
                        if (acceleration_done())
@@ -3042,6 +3051,7 @@ load_video_binaries(void)
         */
        if (my_css.video_settings.video_binary.info)
                return sh_css_success;
+
        online = my_css.input_mode != SH_CSS_INPUT_MODE_MEMORY;
        err = check_input(!online);
        if (err != sh_css_success)
@@ -3066,6 +3076,9 @@ load_video_binaries(void)
        if (err != sh_css_success)
                return err;
 
+       /* This is where we set the flag for invalid first frame */
+       my_css.video_settings.invalid_first_frame = true;
+
        /* Viewfinder post-processing */
        if (online) {
                init_vf_pp_descr(
index 98bfea6..6a497ef 100644 (file)
@@ -218,6 +218,8 @@ enum sh_css_interrupt_info {
        SH_CSS_IRQ_INFO_SW_0 = 1 << 17,
        SH_CSS_IRQ_INFO_SW_1 = 1 << 18,
        SH_CSS_IRQ_INFO_SW_2 = 1 << 19,
+       /* Inform the ISR that there is an invalid first frame */
+       SH_CSS_IRQ_INFO_INVALID_FIRST_FRAME = 1 << 20,
 };
 
 enum sh_css_rx_irq_info {