mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-23 06:08:07 +00:00
- fix large video support
- make H264 decoding buffer dynamic git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@161 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
This commit is contained in:
parent
a68852a1ab
commit
63688aac96
6 changed files with 38 additions and 11 deletions
|
|
@ -593,7 +593,12 @@ SupportLevel linphone_payload_is_supported(LinphoneCore *lc, sdp_payload_t *payl
|
|||
payload->b_as_bandwidth, ubw);
|
||||
}else{
|
||||
/*limit to upload bandwidth if exist, else no limit*/
|
||||
rtppayload->normal_bitrate=(ubw>0)? 1000*ubw : -1;
|
||||
if (ubw>0) rtppayload->normal_bitrate=1000*ubw;
|
||||
else {
|
||||
if (rtppayload->type!=PAYLOAD_VIDEO){
|
||||
rtppayload->normal_bitrate=-1; /*allow speex to use maximum bitrate*/
|
||||
}
|
||||
}
|
||||
}
|
||||
if (payload->a_fmtp!=NULL){
|
||||
payload_type_set_send_fmtp(rtppayload,payload->a_fmtp);
|
||||
|
|
|
|||
|
|
@ -1403,6 +1403,7 @@ void linphone_core_start_media_streams(LinphoneCore *lc, LinphoneCall *call){
|
|||
if (video_params->remoteport>0){
|
||||
if (video_params->relay_session_id!=NULL)
|
||||
video_stream_set_relay_session_id(lc->videostream,video_params->relay_session_id);
|
||||
video_stream_set_sent_video_size(lc->videostream,linphone_core_get_preferred_video_size(lc));
|
||||
if (lc->video_conf.display && lc->video_conf.capture)
|
||||
video_stream_start(lc->videostream,
|
||||
call->profile, video_params->remoteaddr, video_params->remoteport,
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
[Setup]
|
||||
AppName=msx264
|
||||
AppVerName=msx264 version 1.1.6., an H.264 plugin for linphone.
|
||||
AppVerName=msx264 version 1.1.7., an H.264 plugin for linphone.
|
||||
AppPublisher=linphone.org
|
||||
AppPublisherURL=http://www.linphone.org
|
||||
AppSupportURL=http://www.linphone.org
|
||||
|
|
|
|||
|
|
@ -287,7 +287,8 @@ typedef struct _DecData{
|
|||
struct SwsContext *sws_ctx;
|
||||
AVCodecContext av_context;
|
||||
unsigned int packet_num;
|
||||
uint8_t bitstream[65000];
|
||||
uint8_t *bitstream;
|
||||
int bitstream_size;
|
||||
}DecData;
|
||||
|
||||
static void ffmpeg_init(){
|
||||
|
|
@ -323,6 +324,8 @@ static void dec_init(MSFilter *f){
|
|||
dec_open(d);
|
||||
d->outbuf.w=0;
|
||||
d->outbuf.h=0;
|
||||
d->bitstream_size=65536;
|
||||
d->bitstream=ms_malloc0(d->bitstream_size);
|
||||
f->data=d;
|
||||
}
|
||||
|
||||
|
|
@ -338,6 +341,7 @@ static void dec_uninit(MSFilter *f){
|
|||
if (d->yuv_msg) freemsg(d->yuv_msg);
|
||||
if (d->sps) freemsg(d->sps);
|
||||
if (d->pps) freemsg(d->pps);
|
||||
ms_free(d->bitstream);
|
||||
ms_free(d);
|
||||
}
|
||||
|
||||
|
|
@ -409,14 +413,28 @@ static bool_t check_sps_pps_change(DecData *d, mblk_t *sps, mblk_t *pps){
|
|||
return ret1 || ret2;
|
||||
}
|
||||
|
||||
static int nalusToFrame(DecData *d, MSQueue *naluq, uint8_t *bitstream, int size, bool_t *new_sps_pps){
|
||||
static void enlarge_bitstream(DecData *d){
|
||||
d->bitstream_size*=2;
|
||||
d->bitstream=ms_realloc(d->bitstream,d->bitstream_size);
|
||||
}
|
||||
|
||||
static int nalusToFrame(DecData *d, MSQueue *naluq, bool_t *new_sps_pps){
|
||||
mblk_t *im;
|
||||
uint8_t *dst=bitstream,*src;
|
||||
uint8_t *dst=d->bitstream,*src,*end;
|
||||
int nal_len;
|
||||
bool_t start_picture=TRUE;
|
||||
uint8_t nalu_type;
|
||||
*new_sps_pps=FALSE;
|
||||
end=d->bitstream+d->bitstream_size;
|
||||
while((im=ms_queue_get(naluq))!=NULL){
|
||||
src=im->b_rptr;
|
||||
nal_len=im->b_wptr-src;
|
||||
if (dst+nal_len+100>end){
|
||||
int pos=dst-d->bitstream;
|
||||
enlarge_bitstream(d);
|
||||
dst=d->bitstream+pos;
|
||||
end=d->bitstream+d->bitstream_size;
|
||||
}
|
||||
nalu_type=(*src) & ((1<<5)-1);
|
||||
if (nalu_type==7)
|
||||
*new_sps_pps=check_sps_pps_change(d,im,NULL) || *new_sps_pps;
|
||||
|
|
@ -432,14 +450,12 @@ static int nalusToFrame(DecData *d, MSQueue *naluq, uint8_t *bitstream, int size
|
|||
*dst++=1;
|
||||
*dst++=*src++;
|
||||
while(src<(im->b_wptr-3)){
|
||||
#ifdef REMOVE_PREVENTING_BYTES
|
||||
if (src[0]==0 && src[1]==0 && src[2]<=3){
|
||||
*dst++=0;
|
||||
*dst++=0;
|
||||
*dst++=3;
|
||||
src+=2;
|
||||
}
|
||||
#endif
|
||||
*dst++=*src++;
|
||||
}
|
||||
*dst++=*src++;
|
||||
|
|
@ -447,7 +463,7 @@ static int nalusToFrame(DecData *d, MSQueue *naluq, uint8_t *bitstream, int size
|
|||
*dst++=*src++;
|
||||
freemsg(im);
|
||||
}
|
||||
return dst-bitstream;
|
||||
return dst-d->bitstream;
|
||||
}
|
||||
|
||||
static void dec_process(MSFilter *f){
|
||||
|
|
@ -472,7 +488,7 @@ static void dec_process(MSFilter *f){
|
|||
uint8_t *p,*end;
|
||||
bool_t need_reinit=FALSE;
|
||||
|
||||
size=nalusToFrame(d,&nalus,d->bitstream,sizeof(d->bitstream),&need_reinit);
|
||||
size=nalusToFrame(d,&nalus,&need_reinit);
|
||||
if (need_reinit)
|
||||
dec_reinit(d);
|
||||
p=d->bitstream;
|
||||
|
|
|
|||
|
|
@ -515,8 +515,8 @@ static int enc_set_br(MSFilter *f, void *arg){
|
|||
bool_t snow=s->codec==CODEC_ID_SNOW;
|
||||
s->maxbr=*(int*)arg;
|
||||
if (s->maxbr>=1024000 && s->codec!=CODEC_ID_H263P){
|
||||
s->vsize.width = MS_VIDEO_SIZE_4CIF_W;
|
||||
s->vsize.height = MS_VIDEO_SIZE_4CIF_H;
|
||||
s->vsize.width = MS_VIDEO_SIZE_SVGA_W;
|
||||
s->vsize.height = MS_VIDEO_SIZE_SVGA_H;
|
||||
s->fps=17;
|
||||
}else if (s->maxbr>=800000 && s->codec!=CODEC_ID_H263P){
|
||||
s->vsize.width = MS_VIDEO_SIZE_VGA_W;
|
||||
|
|
|
|||
|
|
@ -335,6 +335,11 @@ static bool_t win_display_init(MSDisplay *obj, MSPicture *fbuf){
|
|||
if (wd->window!=NULL) SetWindowLongPtr(wd->window,GWLP_USERDATA,(LONG_PTR)obj);
|
||||
else return FALSE;
|
||||
}
|
||||
}else{
|
||||
/* the window might need to be resized*/
|
||||
RECT cur;
|
||||
GetWindowRect(wd->window,&cur);
|
||||
MoveWindow(wd->window,cur.left, cur.top, wd->fb.w, wd->fb.h,FALSE);
|
||||
}
|
||||
|
||||
if (wd->ddh==NULL) wd->ddh=DrawDibOpen();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue