diff --git a/QCamera2/HAL3/QCamera3HWI.cpp b/QCamera2/HAL3/QCamera3HWI.cpp
index cc17d8a..801ec86 100755
--- a/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/QCamera2/HAL3/QCamera3HWI.cpp
@@ -1829,6 +1829,7 @@
     mPendingReprocessResultList.clear();
 
     mFirstRequest = true;
+    mCurJpegMeta.clear();
     //Get min frame duration for this streams configuration
     deriveMinFrameDuration();
 
@@ -2478,9 +2479,25 @@
 
             i->timestamp = capture_time;
 
+            // Find channel requiring metadata, meaning internal offline postprocess
+            // is needed.
+            //TODO: for now, we don't support two streams requiring metadata at the same time.
+            // (because we are not making copies, and metadata buffer is not reference counted.
+            bool internalPproc = false;
+            for (pendingBufferIterator iter = i->buffers.begin();
+                    iter != i->buffers.end(); iter++) {
+                if (iter->need_metadata) {
+                    internalPproc = true;
+                    QCamera3ProcessingChannel *channel =
+                            (QCamera3ProcessingChannel *)iter->stream->priv;
+                    channel->queueReprocMetadata(metadata_buf);
+                    break;
+                }
+            }
+
             result.result = translateFromHalMetadata(metadata,
                     i->timestamp, i->request_id, i->jpegMetadata, i->pipeline_depth,
-                    i->capture_intent);
+                    i->capture_intent, internalPproc);
 
             saveExifParams(metadata);
 
@@ -2501,24 +2518,13 @@
                 }
             }
 
-            // Find channel requiring metadata, and queue the current metadata.
-            //TODO: for now, we don't support two streams requiring metadata at the same time.
-            // (because we are not making copies, and metadata buffer is not reference counted.
-            pendingBufferIterator iter = i->buffers.begin();
-            while (iter != i->buffers.end() && !iter->need_metadata)
-                iter++;
-            if (iter == i->buffers.end()) {
+            if (!internalPproc) {
                 CDBG("%s: couldn't find need_metadata for this metadata", __func__);
                 // Return metadata buffer
                 if (free_and_bufdone_meta_buf) {
                     mMetadataChannel->bufDone(metadata_buf);
                     free(metadata_buf);
                 }
-            } else {
-                CDBG("%s: need_metadata is set for this metadata", __func__);
-                QCamera3ProcessingChannel *channel =
-                        (QCamera3ProcessingChannel *)iter->stream->priv;
-                channel->queueReprocMetadata(metadata_buf);
             }
         }
         if (!result.result) {
@@ -3249,7 +3255,8 @@
     pendingRequest.settings = input_settings.release();
     pendingRequest.pipeline_depth = 0;
     pendingRequest.partial_result_cnt = 0;
-    extractJpegMetadata(pendingRequest.jpegMetadata, request);
+    extractJpegMetadata(mCurJpegMeta, request);
+    pendingRequest.jpegMetadata = mCurJpegMeta;
 
     //extract capture intent
     if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
@@ -3742,6 +3749,7 @@
  *   @timestamp: metadata buffer timestamp
  *   @request_id: request id
  *   @jpegMetadata: additional jpeg metadata
+ *   @pprocDone: whether internal offline postprocsesing is done
  *
  * RETURN     : camera_metadata_t*
  *              metadata in a format specified by fwk
@@ -3753,7 +3761,8 @@
                                  int32_t request_id,
                                  const CameraMetadata& jpegMetadata,
                                  uint8_t pipeline_depth,
-                                 uint8_t capture_intent)
+                                 uint8_t capture_intent,
+                                 bool pprocDone)
 {
     CameraMetadata camMetadata;
     camera_metadata_t *resultMetadata;
@@ -4375,7 +4384,16 @@
     // Reprocess crop data
     IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, metadata) {
         uint8_t cnt = crop_data->num_of_streams;
-        if ((0 < cnt) && (cnt < MAX_NUM_STREAMS)) {
+        if (pprocDone) {
+            // HAL already does internal reprocessing, either via reprocessing before
+            // JPEG encoding, or offline postprocessing for pproc bypass case.
+            CDBG("%s: Internal offline postprocessing was done, no need for further crop", __func__);
+        } else if ( (0 >= cnt) || (cnt > MAX_NUM_STREAMS)) {
+            // mm-qcamera-daemon only posts crop_data for streams
+            // not linked to pproc. So no valid crop metadata is not
+            // necessarily an error case.
+            CDBG("%s: No valid crop metadata entries", __func__);
+        } else {
             uint32_t reproc_stream_id;
             if ( NO_ERROR != getReprocessibleOutputStreamId(reproc_stream_id)) {
                 CDBG("%s: No reprocessible stream found, ignore crop data", __func__);
@@ -4428,11 +4446,6 @@
                    delete [] crop;
                }
             }
-        } else {
-            // mm-qcamera-daemon only posts crop_data for streams
-            // not linked to pproc. So no valid crop metadata is not
-            // necessarily an error case.
-            CDBG("%s: No valid crop metadata entries", __func__);
         }
     }
 
diff --git a/QCamera2/HAL3/QCamera3HWI.h b/QCamera2/HAL3/QCamera3HWI.h
index d009625..f93d83e 100755
--- a/QCamera2/HAL3/QCamera3HWI.h
+++ b/QCamera2/HAL3/QCamera3HWI.h
@@ -174,7 +174,7 @@
     camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
                             nsecs_t timestamp, int32_t request_id,
                             const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
-                            uint8_t capture_intent);
+                            uint8_t capture_intent, bool pprocDone);
     int initParameters();
     void deinitParameters();
     QCamera3ReprocessChannel *addOfflineReprocChannel(const reprocess_config_t &config,
@@ -292,6 +292,7 @@
     QCamera3HeapMemory *mParamHeap;
     metadata_buffer_t* mParameters;
     metadata_buffer_t* mPrevParameters;
+    CameraMetadata mCurJpegMeta;
     bool m_bIsVideo;
     bool m_bIs4KVideo;
     bool m_bEisSupportedSize;
