merge in nyc-mr1-release history after reset to nyc-mr1-dev
diff --git a/msmcobalt/mm-core/src/msm8953/registry_table.c b/msmcobalt/mm-core/src/msm8953/registry_table.c
index 48831f3..b6ac3ed 100755
--- a/msmcobalt/mm-core/src/msm8953/registry_table.c
+++ b/msmcobalt/mm-core/src/msm8953/registry_table.c
@@ -274,6 +274,32 @@
       "video_decoder.vp9"
     }
   },
+  {
+    "OMX.qcom.audio.decoder.amrwb",
+    NULL,   // Create instance function
+    // Unique instance handle
+    {
+      NULL
+    },
+    NULL,   // Shared object library handle
+    "libOmxAmrDec.so",
+    {
+     "audio_decoder.amrwb"
+    }
+  },
+  {
+    "OMX.qcom.audio.decoder.amrnb",
+    NULL,   // Create instance function
+    // Unique instance handle
+    {
+      NULL
+    },
+    NULL,   // Shared object library handle
+    "libOmxAmrDec.so",
+    {
+      "audio_decoder.amrnb"
+    }
+  },
    {
     "OMX.qcom.video.encoder.mpeg4",
     NULL,   // Create instance function
diff --git a/msmcobalt/mm-core/src/msm8953/registry_table_android.c b/msmcobalt/mm-core/src/msm8953/registry_table_android.c
index 0d8c8ca..b5aaa5f 100755
--- a/msmcobalt/mm-core/src/msm8953/registry_table_android.c
+++ b/msmcobalt/mm-core/src/msm8953/registry_table_android.c
@@ -301,6 +301,32 @@
     }
   },
   {
+    "OMX.qcom.audio.decoder.amrnb",
+    NULL,   // Create instance function
+    // Unique instance handle
+    {
+      NULL
+    },
+    NULL,   // Shared object library handle
+    "libOmxAmrDec.so",
+    {
+      "audio_decoder.amrnb"
+    }
+  },
+  {
+    "OMX.qcom.audio.decoder.amrwb",
+    NULL,   // Create instance function
+    // Unique instance handle
+    {
+      NULL
+    },
+    NULL,   // Shared object library handle
+    "libOmxAmrDec.so",
+    {
+      "audio_decoder.amrwb"
+    }
+  },
+  {
     "OMX.qcom.video.encoder.mpeg4",
     NULL, // Create instance function
     // Unique instance handle
diff --git a/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
index 2f44cd8..2376b62 100644
--- a/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
+++ b/msmcobalt/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h
@@ -1173,8 +1173,8 @@
                 OMX_COLOR_FORMATTYPE formatsDefault[] = {
                     [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed,
                     [1] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
-                    [2] = OMX_COLOR_FormatYUV420Planar,
-                    [3] = OMX_COLOR_FormatYUV420SemiPlanar,
+                    [2] = OMX_COLOR_FormatYUV420SemiPlanar,
+                    [3] = OMX_COLOR_FormatYUV420Planar,
                     [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
                 };
                 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
@@ -1182,8 +1182,8 @@
             } else {
                 OMX_COLOR_FORMATTYPE formatsDefault[] = {
                     [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
-                    [1] = OMX_COLOR_FormatYUV420Planar,
-                    [2] = OMX_COLOR_FormatYUV420SemiPlanar,
+                    [1] = OMX_COLOR_FormatYUV420SemiPlanar,
+                    [2] = OMX_COLOR_FormatYUV420Planar,
                     [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
                 };
                 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
diff --git a/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp b/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp
index 2698d52..eda46e4 100644
--- a/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_swvdec.cpp
@@ -3213,6 +3213,7 @@
         case OMX_COLOR_FormatYUV420SemiPlanar:
         {
             // do nothing; standard OMX color formats should not be described
+            retval = OMX_ErrorUnsupportedSetting;
             break;
         }
 
diff --git a/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
index 90b930a..b722408 100644
--- a/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -8163,47 +8163,6 @@
         }
     }
 
-    if (!output_flush_progress && (buffer->nFilledLen > 0)) {
-        // set the default colorspace advised by client, since the bitstream may be
-        // devoid of colorspace-info.
-        if (m_enable_android_native_buffers) {
-            ColorSpace_t color_space = ITU_R_601;
-
-        // Disabled ?
-        // WA for VP8. Vp8 encoder does not embed color-info (yet!).
-        // Encoding RGBA results in 601-LR for all resolutions.
-        // This conflicts with the client't defaults which are based on resolution.
-        //   Eg: 720p will be encoded as 601-LR. Client will say 709.
-        // Re-enable this code once vp8 encoder generates color-info and hence the
-        // decoder will be able to override with the correct source color.
-#if 0
-            switch (m_client_color_space.sAspects.mPrimaries) {
-                case ColorAspects::PrimariesBT601_6_625:
-                case ColorAspects::PrimariesBT601_6_525:
-                {
-                    color_space = m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ?
-                            ITU_R_601_FR : ITU_R_601;
-                    break;
-                }
-                case ColorAspects::PrimariesBT709_5:
-                {
-                    color_space = ITU_R_709;
-                    break;
-                }
-                default:
-                {
-                    break;
-                }
-            }
-#endif
-            DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)",
-                    color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
-            set_colorspace_in_handle(color_space, buffer - m_out_mem_ptr);
-        }
-        DEBUG_PRINT_LOW("Processing extradata");
-        handle_extradata(buffer);
-    }
-
 #ifdef OUTPUT_EXTRADATA_LOG
     if (outputExtradataFile) {
         int buf_index = buffer - m_out_mem_ptr;
@@ -8684,6 +8643,45 @@
                    }
 
                    if (vdec_msg->msgdata.output_frame.len) {
+                       if (!omx->output_flush_progress && (omxhdr->nFilledLen > 0)) {
+                           // set the default colorspace advised by client, since the bitstream may be
+                           // devoid of colorspace-info.
+                           if (omx->m_enable_android_native_buffers) {
+                               ColorSpace_t color_space = ITU_R_601;
+
+                           // Disabled ?
+                           // WA for VP8. Vp8 encoder does not embed color-info (yet!).
+                           // Encoding RGBA results in 601-LR for all resolutions.
+                           // This conflicts with the client't defaults which are based on resolution.
+                           //   Eg: 720p will be encoded as 601-LR. Client will say 709.
+                           // Re-enable this code once vp8 encoder generates color-info and hence the
+                           // decoder will be able to override with the correct source color.
+#if 0
+                               switch (omx->m_client_color_space.sAspects.mPrimaries) {
+                                   case ColorAspects::PrimariesBT601_6_625:
+                                   case ColorAspects::PrimariesBT601_6_525:
+                                   {
+                                       color_space = omx->m_client_color_space.sAspects.mRange == ColorAspects::RangeFull ?
+                                               ITU_R_601_FR : ITU_R_601;
+                                       break;
+                                   }
+                                   case ColorAspects::PrimariesBT709_5:
+                                   {
+                                       color_space = ITU_R_709;
+                                       break;
+                                   }
+                                   default:
+                                   {
+                                       break;
+                                   }
+                               }
+#endif
+                               DEBUG_PRINT_LOW("setMetaData for Color Space (client) = 0x%x (601=%u FR=%u 709=%u)",
+                                       color_space, ITU_R_601, ITU_R_601_FR, ITU_R_709);
+                               omx->set_colorspace_in_handle(color_space, omxhdr - omx->m_out_mem_ptr);
+                           }
+                       }
+
                        DEBUG_PRINT_LOW("Processing extradata");
                        omx->handle_extradata(omxhdr);
 
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index 43d2705..b3794b4 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -458,7 +458,8 @@
         bool async_thread_force_stop;
         class omx_venc *venc_handle;
         OMX_ERRORTYPE allocate_extradata(struct extradata_buffer_info *extradata_info);
-        void free_extradata();
+        void free_extradata_all();
+        void free_extradata(struct extradata_buffer_info *extradata_info);
         int append_mbi_extradata(void *, struct msm_vidc_extradata_header*);
         bool handle_output_extradata(void *, int);
         bool handle_input_extradata(struct v4l2_buffer);
diff --git a/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
index b2a00cd..a6d119d 100644
--- a/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
+++ b/msmcobalt/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
@@ -1020,45 +1020,38 @@
     return OMX_ErrorNone;
 }
 
-void venc_dev::free_extradata()
+void venc_dev::free_extradata(struct extradata_buffer_info *extradata_info)
 {
 #ifdef USE_ION
 
-    if (output_extradata_info.uaddr) {
-        munmap((void *)output_extradata_info.uaddr, output_extradata_info.size);
-        close(output_extradata_info.ion.fd_ion_data.fd);
-        venc_handle->free_ion_memory(&output_extradata_info.ion);
-    }
-    if (output_extradata_info.m_ion_dev)
-        close(output_extradata_info.m_ion_dev);
-
-    memset(&output_extradata_info, 0, sizeof(output_extradata_info));
-    output_extradata_info.ion.fd_ion_data.fd = -1;
-
-    if (input_extradata_info.uaddr) {
-        munmap((void *)input_extradata_info.uaddr, input_extradata_info.size);
-        close(input_extradata_info.ion.fd_ion_data.fd);
-        venc_handle->free_ion_memory(&input_extradata_info.ion);
+    if (extradata_info == NULL) {
+        return;
     }
 
-    if (input_extradata_info.m_ion_dev)
-        close(output_extradata_info.m_ion_dev);
+    if (extradata_info->uaddr) {
+        munmap((void *)extradata_info->uaddr, extradata_info->size);
+        extradata_info->uaddr = NULL;
+        close(extradata_info->ion.fd_ion_data.fd);
+        venc_handle->free_ion_memory(&extradata_info->ion);
+    }
 
-    memset(&input_extradata_info, 0, sizeof(input_extradata_info));
-    input_extradata_info.ion.fd_ion_data.fd = -1;
+    if (extradata_info->m_ion_dev)
+        close(extradata_info->m_ion_dev);
 
+    memset(extradata_info, 0, sizeof(*extradata_info));
+    extradata_info->ion.fd_ion_data.fd = -1;
+    extradata_info->allocated = OMX_FALSE;
+
+#endif // USE_ION
+}
+
+void venc_dev::free_extradata_all()
+{
+    free_extradata(&output_extradata_info);
+    free_extradata(&input_extradata_info);
 #ifdef _PQ_
-    if (m_pq.roi_extradata_info.uaddr) {
-        munmap((void *)m_pq.roi_extradata_info.uaddr, m_pq.roi_extradata_info.size);
-        close(m_pq.roi_extradata_info.ion.fd_ion_data.fd);
-        venc_handle->free_ion_memory(&m_pq.roi_extradata_info.ion);
-    }
-
-    memset(&m_pq.roi_extradata_info, 0, sizeof(m_pq.roi_extradata_info));
-    m_pq.roi_extradata_info.ion.fd_ion_data.fd = -1;
+    free_extradata(&m_pq.roi_extradata_info);
 #endif // _PQ_
-
-#endif
 }
 
 bool venc_dev::venc_get_output_log_flag()
@@ -1510,7 +1503,6 @@
 #ifdef _PQ_
     if (codec == OMX_VIDEO_CodingAVC) {
         m_pq.init(V4L2_DEFAULT_OUTPUT_COLOR_FMT);
-        allocate_extradata(&m_pq.roi_extradata_info);
         m_pq.get_caps();
     }
 #endif // _PQ_
@@ -2574,6 +2566,7 @@
                 }
 #ifdef _PQ_
                 m_pq.pConfig.a_qp.roi_enabled = (OMX_U32)true;
+                allocate_extradata(&m_pq.roi_extradata_info);
                 m_pq.configure();
 #endif // _PQ_
                 break;
@@ -3154,7 +3147,7 @@
 unsigned venc_dev::venc_stop_done(void)
 {
     struct venc_msg venc_msg;
-    free_extradata();
+    free_extradata_all();
     venc_msg.msgcode=VEN_MSG_STOP;
     venc_msg.statuscode=VEN_S_SUCCESS;
     venc_handle->async_message_process(venc_handle,&venc_msg);
@@ -3496,6 +3489,17 @@
     struct v4l2_encoder_cmd enc;
     DEBUG_PRINT_LOW("in %s", __func__);
 
+    unsigned int cookie = 0;
+    for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) {
+        cookie = fd_list[i];
+        if (cookie != 0) {
+            if (!ioctl(input_extradata_info.m_ion_dev, ION_IOC_FREE, &cookie)) {
+                DEBUG_PRINT_HIGH("Freed handle = %u", cookie);
+            }
+            fd_list[i] = 0;
+        }
+    }
+
     enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH;
     enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE;
 
@@ -4410,14 +4414,19 @@
     fdData.fd = buffer_fd;
     if (ion_fd && !ioctl(ion_fd, ION_IOC_IMPORT, &fdData)) {
         cookie = fdData.handle;
+        DEBUG_PRINT_HIGH("FD = %u imported handle = %u", fdData.fd, fdData.handle);
     }
 
     for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) {
         if (fd_list[i] == cookie) {
             DEBUG_PRINT_HIGH("FD is present at index = %d", i);
+            if (ion_fd && !ioctl(ion_fd, ION_IOC_FREE, &fdData.handle)) {
+                DEBUG_PRINT_HIGH("freed handle = %u", cookie);
+            }
             return i;
         }
     }
+
     for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++)
         if (fd_list[i] == 0) {
             DEBUG_PRINT_HIGH("FD added at index = %d", i);