Ignore:
Timestamp:
Mar 17, 2011 11:33:34 AM (10 years ago)
Author:
bennylp
Message:

Re #1215 (framework):

  • vstream:
    • allow NULL pool parameter which means vstream will create one
    • Updated remote FPS detection to only be performed if decoder returns frame (however the FPS detection is currently disabled as some endpoints changes fps continuously, causing renderer restart continuously too).
  • codec:
    • Updated video codec info to have RTP packetization support flag, also update endpoint in generating SDP to only include codecs whose RTP packetization support.
    • Added dynamic payload types for video codecs.
    • (minor) separate video PT into separate enum in pjmedia-codec/types.h
  • H264 initial experiment.

generated frames (for libx264 sake).

  • Replaced PJ_EUNKNOWN in some places with the appropriate error code.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia-codec/ffmpeg_codecs.c

    r3435 r3461  
    246246{ 
    247247    { 
    248         {PJMEDIA_FORMAT_H263P,  {"H263-1998",9},    PJMEDIA_RTP_PT_H263}, 
     248        {PJMEDIA_FORMAT_H263P,  {"H263-1998",9},    PJMEDIA_RTP_PT_H263P}, 
    249249        PJMEDIA_FORMAT_H263,    1000000,    2000000, 
    250250        &h263_packetize, &h263_unpacketize, &h263_parse_fmtp, 
     
    258258    }, 
    259259    { 
     260        {PJMEDIA_FORMAT_H264,   {"H264",4},         PJMEDIA_RTP_PT_H264}, 
     261    }, 
     262    { 
    260263        {PJMEDIA_FORMAT_H261,   {"H261",4},         PJMEDIA_RTP_PT_H261}, 
    261264    }, 
     
    264267    }, 
    265268    { 
    266         {PJMEDIA_FORMAT_MPEG4,  {"MP4V",4},         PJMEDIA_RTP_PT_MPV}, 
     269        {PJMEDIA_FORMAT_MPEG4,  {"MP4V",4}}, 
    267270    }, 
    268271    { 
    269         {PJMEDIA_FORMAT_XVID,   {"XVID",4},         PJMEDIA_RTP_PT_MPV}, 
     272        {PJMEDIA_FORMAT_XVID,   {"XVID",4}}, 
    270273        PJMEDIA_FORMAT_MPEG4, 
    271274    }, 
     
    452455                PJ_TODO(NOTIFY_APP_ABOUT_THIS_NEW_ENCODING_FORMAT); 
    453456            } else { 
    454                 return PJ_EUNKNOWN; 
     457                return PJMEDIA_EBADFMT; 
    455458            } 
    456459        } 
     
    532535    avcodec_init(); 
    533536    avcodec_register_all(); 
     537    av_log_set_level(AV_LOG_ERROR); 
    534538 
    535539    /* Enum FFMPEG codecs */ 
     
    649653        if (desc->info.clock_rate == 0) 
    650654            desc->info.clock_rate = 90000; 
     655 
     656        /* Set RTP packetization support flag in the codec info */ 
     657        desc->info.has_rtp_pack = (desc->packetize != NULL) && 
     658                                  (desc->unpacketize != NULL); 
    651659    } 
    652660 
     
    9941002            if (vfd->avg_bps) { 
    9951003                ctx->bit_rate = vfd->avg_bps; 
    996                 if (vfd->max_bps) 
     1004                if (vfd->max_bps > vfd->avg_bps) 
    9971005                    ctx->bit_rate_tolerance = vfd->max_bps - vfd->avg_bps; 
     1006            } 
     1007 
     1008            /* Libx264 experimental setting (it rejects ffmpeg defaults) */ 
     1009            if (ff->param.enc_fmt.id == PJMEDIA_FORMAT_H264) { 
     1010                ctx->me_range = 16; 
     1011                ctx->max_qdiff = 4; 
     1012                ctx->qmin = 10; 
     1013                ctx->qmax = 51; 
     1014                ctx->qcompress = 0.6f; 
    9981015            } 
    9991016 
     
    10271044        if (err < 0) { 
    10281045            print_ffmpeg_err(err); 
    1029             return PJ_EUNKNOWN; 
     1046            return PJMEDIA_CODEC_EFAILED; 
    10301047        } 
    10311048 
     
    12191236 
    12201237    avcodec_get_frame_defaults(&avframe); 
     1238    avframe.pts = input->timestamp.u64; 
    12211239     
    12221240    for (i = 0; i < ff->enc_vfi->plane_cnt; ++i) { 
     
    12491267    if (err < 0) { 
    12501268        print_ffmpeg_err(err); 
    1251         return PJ_EUNKNOWN; 
     1269        return PJMEDIA_CODEC_EFAILED; 
    12521270    } else { 
    12531271        output->size = err; 
     
    13011319 
    13021320    output->bit_info = 0; 
     1321    output->timestamp = input->timestamp; 
    13031322 
    13041323#if LIBAVCODEC_VERSION_MAJOR >= 52 && LIBAVCODEC_VERSION_MINOR >= 72 
     
    13161335#endif 
    13171336    if (err < 0) { 
     1337        output->type = PJMEDIA_FRAME_TYPE_NONE; 
     1338        output->size = 0; 
    13181339        print_ffmpeg_err(err); 
    1319         return PJ_EUNKNOWN; 
     1340        return PJMEDIA_CODEC_EFAILED; 
    13201341    } else if (got_picture) { 
    13211342        pjmedia_video_apply_fmt_param *vafp = &ff->dec_vafp; 
     
    13471368            ff->dec_vfi = pjmedia_get_video_format_info(NULL, ff->param.dec_fmt.id); 
    13481369            if (!ff->dec_vfi) 
    1349                 return PJ_EUNKNOWN; 
     1370                return PJ_ENOTSUP; 
    13501371            pj_bzero(&ff->dec_vafp, sizeof(ff->dec_vafp)); 
    13511372            ff->dec_vafp.size = ff->param.dec_fmt.det.vid.size; 
     
    13851406        } 
    13861407 
     1408        output->type = PJMEDIA_FRAME_TYPE_VIDEO; 
    13871409        output->size = vafp->framebytes; 
    13881410    } else { 
    1389         return PJ_EUNKNOWN; 
    1390     } 
    1391  
     1411        output->type = PJMEDIA_FRAME_TYPE_NONE; 
     1412        output->size = 0; 
     1413    } 
     1414     
    13921415    return PJ_SUCCESS; 
    13931416} 
Note: See TracChangeset for help on using the changeset viewer.