summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiza Sulistyo <riza@teluu.com>2014-09-01 04:03:31 +0000
committerRiza Sulistyo <riza@teluu.com>2014-09-01 04:03:31 +0000
commit20b4f147ff40b51cbe6c42465e3777fbbd82c5eb (patch)
treef97379a3401505167a6b2ce23b702c4d2dea54ce
parent2aeece9c5b02c9ce94c0d8cadf87418640f70ea5 (diff)
Re #1762: When capturing, image stride is not always equal to the image width. I.e on Ipad air, at 352*288 the image stride is 384. Additional discard process is
needed to correct the image rendered. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4909 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/src/pjmedia-videodev/ios_dev.m43
1 files changed, 35 insertions, 8 deletions
diff --git a/pjmedia/src/pjmedia-videodev/ios_dev.m b/pjmedia/src/pjmedia-videodev/ios_dev.m
index d73b47e3..cb100cfd 100644
--- a/pjmedia/src/pjmedia-videodev/ios_dev.m
+++ b/pjmedia/src/pjmedia-videodev/ios_dev.m
@@ -402,26 +402,53 @@ static pj_status_t ios_factory_default_param(pj_pool_t *pool,
frame.type = PJMEDIA_FRAME_TYPE_VIDEO;
frame.size = stream->frame_size;
frame.timestamp.u64 = stream->frame_ts.u64;
-
+
if (stream->is_planar && stream->capture_buf) {
if (stream->param.fmt.id == PJMEDIA_FORMAT_I420) {
/* kCVPixelFormatType_420YpCbCr8BiPlanar* is NV12 */
pj_uint8_t *p, *p_end, *Y, *U, *V;
pj_size_t p_len;
+ /* Image stride is not always equal to the image width. I.e on Ipad
+ * air, at 352*288 the image stride is 384.
+ */
+ pj_size_t stride = CVPixelBufferGetBytesPerRowOfPlane(img, 0);
+ pj_bool_t need_clip = (stride != stream->size.w);
p = (pj_uint8_t*)CVPixelBufferGetBaseAddressOfPlane(img, 0);
p_len = stream->size.w * stream->size.h;
Y = (pj_uint8_t*)stream->capture_buf;
U = Y + p_len;
V = U + p_len/4;
- pj_memcpy(Y, p, p_len);
-
+
+ if (!need_clip) {
+ pj_memcpy(Y, p, p_len);
+ } else {
+ int i = 0;
+ for (;i<stream->size.h;++i) {
+ pj_memcpy(Y+(i*stream->size.w), p+(i*stride),
+ stream->size.w);
+ }
+ }
+
p = (pj_uint8_t*)CVPixelBufferGetBaseAddressOfPlane(img, 1);
- p_len >>= 1;
- p_end = p + p_len;
- while (p < p_end) {
- *U++ = *p++;
- *V++ = *p++;
+ if (!need_clip) {
+ p_len >>= 1;
+ p_end = p + p_len;
+
+ while (p < p_end) {
+ *U++ = *p++;
+ *V++ = *p++;
+ }
+ } else {
+ int i = 0;
+ for (;i<(stream->size.h)/2;++i) {
+ int y=0;
+ for (;y<(stream->size.w)/2;++y) {
+ *U++ = *p++;
+ *V++ = *p++;
+ }
+ p += (stride - stream->size.w);
+ }
}
frame.buf = stream->capture_buf;