summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-03-29 10:54:01 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-03-29 10:54:01 +0000
commit11c5ee4fb0231483b314c898841f4c80f6fbc9b3 (patch)
tree0da0df88f45dac95c37fed1a75595af24614169e
parent6343db17cc67a3ffe11e4d4f45829c3e58458179 (diff)
Fix #1473: Fixed H263 encoder setting negotiation in pjmedia_vid_codec_h263_apply_fmtp() to be based on pjmedia_vid_codec_param.enc_fmt.det.vid.fps (it was based on local H263 SDP fmtp).
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3995 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/src/pjmedia/vid_codec_util.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/pjmedia/src/pjmedia/vid_codec_util.c b/pjmedia/src/pjmedia/vid_codec_util.c
index 604a4174..5a8bb2fd 100644
--- a/pjmedia/src/pjmedia/vid_codec_util.c
+++ b/pjmedia/src/pjmedia/vid_codec_util.c
@@ -149,6 +149,20 @@ PJ_DEF(pj_status_t) pjmedia_vid_codec_parse_h263_fmtp(
}
+static unsigned fps_to_mpi(const pjmedia_ratio *fps)
+{
+ unsigned mpi;
+
+ /* Original formula = (fps->denum * 30000) / (fps->num * 1001) */
+ mpi = (fps->denum*30000 + fps->num*1001/2) / (fps->num*1001);
+
+ /* Normalize, should be in the range of 1-32 */
+ if (mpi > 32) mpi = 32;
+ if (mpi < 1) mpi = 1;
+
+ return mpi;
+};
+
PJ_DEF(pj_status_t) pjmedia_vid_codec_h263_apply_fmtp(
pjmedia_vid_codec_param *param)
{
@@ -159,11 +173,19 @@ PJ_DEF(pj_status_t) pjmedia_vid_codec_h263_apply_fmtp(
pjmedia_video_format_detail *vfd;
pj_status_t status;
+ vfd = pjmedia_format_get_video_format_detail(&param->enc_fmt,
+ PJ_TRUE);
+
/* Get local param */
- status = pjmedia_vid_codec_parse_h263_fmtp(&param->dec_fmtp,
- &fmtp_loc);
- if (status != PJ_SUCCESS)
- return status;
+ // Local param should be fetched from "param->enc_fmt" instead of
+ // "param->dec_fmtp".
+ //status = pjmedia_vid_codec_parse_h263_fmtp(&param->dec_fmtp,
+ // &fmtp_loc);
+ //if (status != PJ_SUCCESS)
+ // return status;
+ fmtp_loc.mpi_cnt = 1;
+ fmtp_loc.mpi[0].size = vfd->size;
+ fmtp_loc.mpi[0].val = fps_to_mpi(&vfd->fps);
/* Get remote param */
status = pjmedia_vid_codec_parse_h263_fmtp(&param->enc_fmtp,
@@ -177,10 +199,10 @@ PJ_DEF(pj_status_t) pjmedia_vid_codec_h263_apply_fmtp(
size.w = 176;
size.h = 144;
mpi = 1;
- } else if (fmtp_loc.mpi_cnt == 0) {
- /* Local MPI setting not set, just use remote preference. */
- size = fmtp_rem.mpi[0].size;
- mpi = fmtp_rem.mpi[0].val;
+ //} else if (fmtp_loc.mpi_cnt == 0) {
+ // /* Local MPI setting not set, just use remote preference. */
+ // size = fmtp_rem.mpi[0].size;
+ // mpi = fmtp_rem.mpi[0].val;
} else {
/* Both have preferences, let's try to match them */
unsigned i, j;
@@ -219,8 +241,6 @@ PJ_DEF(pj_status_t) pjmedia_vid_codec_h263_apply_fmtp(
}
/* Apply the negotiation result */
- vfd = pjmedia_format_get_video_format_detail(&param->enc_fmt,
- PJ_TRUE);
vfd->size = size;
vfd->fps.num = 30000;
vfd->fps.denum = 1001 * mpi;