Changeset 4047


Ignore:
Timestamp:
Apr 13, 2012 4:59:05 AM (8 years ago)
Author:
ming
Message:

Re #1478: Moved codec creation from dev_stream to dev_info

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-videodev/avi_dev.c

    r4034 r4047  
    4747    pjmedia_port                *vid; 
    4848    avi_dev_strm                *strm; 
     49    pjmedia_vid_codec           *codec; 
     50    pj_uint8_t                  *enc_buf; 
     51    pj_size_t                    enc_buf_size; 
    4952}; 
    5053 
     
    7073    pjmedia_vid_dev_cb               vid_cb;        /**< Stream callback.   */ 
    7174    void                            *user_data;     /**< Application data.  */ 
    72     pjmedia_vid_codec               *codec; 
    73     pj_uint8_t                      *enc_buf; 
    74     pj_size_t                        enc_buf_size; 
    7575}; 
    7676 
     
    273273    } 
    274274 
     275    if (adi->codec) { 
     276        pjmedia_vid_codec_close(adi->codec); 
     277        adi->codec = NULL; 
     278    } 
     279 
    275280    if (adi->pool) 
    276281        pj_pool_release(adi->pool); 
     
    361366    unsigned local_idx; 
    362367    struct avi_dev_info *adi = NULL; 
     368    pjmedia_format avi_fmt; 
     369    const pjmedia_video_format_info *vfi; 
    363370    pj_status_t status; 
    364371 
     
    410417                adi->fpath.ptr)); 
    411418        goto on_error; 
     419    } 
     420 
     421    pjmedia_format_copy(&avi_fmt, &adi->vid->info.fmt); 
     422    vfi = pjmedia_get_video_format_info(NULL, avi_fmt.id); 
     423    /* Check whether the frame is encoded. */ 
     424    if (!vfi || vfi->bpp == 0) { 
     425        /* Yes, prepare codec */ 
     426        const pjmedia_vid_codec_info *codec_info; 
     427        pjmedia_vid_codec_param codec_param; 
     428        pjmedia_video_apply_fmt_param vafp; 
     429 
     430        /* Lookup codec */ 
     431        status = pjmedia_vid_codec_mgr_get_codec_info2(NULL, 
     432                                                       avi_fmt.id, 
     433                                                       &codec_info); 
     434        if (status != PJ_SUCCESS || !codec_info) 
     435            goto on_error; 
     436 
     437        status = pjmedia_vid_codec_mgr_get_default_param(NULL, codec_info, 
     438                                                         &codec_param); 
     439        if (status != PJ_SUCCESS) 
     440            goto on_error; 
     441 
     442        /* Open codec */ 
     443        status = pjmedia_vid_codec_mgr_alloc_codec(NULL, codec_info, 
     444                                                   &adi->codec); 
     445        if (status != PJ_SUCCESS) 
     446            goto on_error; 
     447 
     448        status = pjmedia_vid_codec_init(adi->codec, adi->pool); 
     449        if (status != PJ_SUCCESS) 
     450            goto on_error; 
     451 
     452        codec_param.dir = PJMEDIA_DIR_DECODING; 
     453        codec_param.packing = PJMEDIA_VID_PACKING_WHOLE; 
     454        status = pjmedia_vid_codec_open(adi->codec, &codec_param); 
     455        if (status != PJ_SUCCESS) 
     456            goto on_error; 
     457 
     458        /* Allocate buffer */ 
     459        avi_fmt.id = codec_info->dec_fmt_id[0]; 
     460        vfi = pjmedia_get_video_format_info(NULL, avi_fmt.id); 
     461        pj_bzero(&vafp, sizeof(vafp)); 
     462        vafp.size = avi_fmt.det.vid.size; 
     463        status = vfi->apply_fmt(vfi, &vafp); 
     464        if (status != PJ_SUCCESS) 
     465            goto on_error; 
     466 
     467        adi->enc_buf = pj_pool_alloc(adi->pool, vafp.framebytes); 
     468        adi->enc_buf_size = vafp.framebytes; 
    412469    } 
    413470 
     
    437494    adi->info.caps = PJMEDIA_VID_DEV_CAP_FORMAT; 
    438495    adi->info.fmt_cnt = 1; 
    439     pjmedia_format_copy(&adi->info.fmt[0], &adi->vid->info.fmt); 
     496    pjmedia_format_copy(&adi->info.fmt[0], &avi_fmt); 
    440497 
    441498    /* Set out vars */ 
     
    449506 
    450507on_error: 
     508    if (adi->codec) { 
     509        pjmedia_vid_codec_close(adi->codec); 
     510        adi->codec = NULL; 
     511    } 
    451512    if (adi->pool) { 
    452513        pj_pool_release(adi->pool); 
     
    470531    struct avi_dev_info *adi; 
    471532    struct avi_dev_strm *strm; 
    472     pjmedia_format avi_fmt; 
    473     const pjmedia_video_format_info *vfi; 
    474     pj_status_t status = PJ_SUCCESS; 
    475533 
    476534    PJ_ASSERT_RETURN(f && param && p_vid_strm, PJ_EINVAL); 
     
    498556    strm->adi = adi; 
    499557 
    500     pjmedia_format_copy(&avi_fmt, &adi->vid->info.fmt); 
    501     vfi = pjmedia_get_video_format_info(NULL, avi_fmt.id); 
    502     /* Check whether the frame is encoded. */ 
    503     if (!vfi || vfi->bpp == 0) { 
    504         /* Yes, prepare codec */ 
    505         const pjmedia_vid_codec_info *codec_info; 
    506         pjmedia_vid_codec_param codec_param; 
    507         pjmedia_video_apply_fmt_param vafp; 
    508  
    509         /* Lookup codec */ 
    510         status = pjmedia_vid_codec_mgr_get_codec_info2(NULL, 
    511                                                        avi_fmt.id, 
    512                                                        &codec_info); 
    513         if (status != PJ_SUCCESS || !codec_info) 
    514             goto on_error; 
    515  
    516         status = pjmedia_vid_codec_mgr_get_default_param(NULL, codec_info, 
    517                                                          &codec_param); 
    518         if (status != PJ_SUCCESS) 
    519             goto on_error; 
    520  
    521         /* Open codec */ 
    522         status = pjmedia_vid_codec_mgr_alloc_codec(NULL, codec_info, 
    523                                                    &strm->codec); 
    524         if (status != PJ_SUCCESS) 
    525             goto on_error; 
    526  
    527         status = pjmedia_vid_codec_init(strm->codec, strm->pool); 
    528         if (status != PJ_SUCCESS) 
    529             goto on_error; 
    530  
    531         codec_param.dir = PJMEDIA_DIR_DECODING; 
    532         codec_param.packing = PJMEDIA_VID_PACKING_WHOLE; 
    533         status = pjmedia_vid_codec_open(strm->codec, &codec_param); 
    534         if (status != PJ_SUCCESS) 
    535             goto on_error; 
    536  
    537         /* Allocate buffer */ 
    538         avi_fmt.id = codec_info->dec_fmt_id[0]; 
    539         vfi = pjmedia_get_video_format_info(NULL, avi_fmt.id); 
    540         pj_bzero(&vafp, sizeof(vafp)); 
    541         vafp.size = avi_fmt.det.vid.size; 
    542         status = vfi->apply_fmt(vfi, &vafp); 
    543         if (status != PJ_SUCCESS) 
    544             goto on_error; 
    545  
    546         strm->enc_buf = pj_pool_alloc(strm->pool, vafp.framebytes); 
    547         strm->enc_buf_size = vafp.framebytes; 
    548     } 
    549     pjmedia_format_copy(&param->fmt, &avi_fmt); 
     558    pjmedia_format_copy(&param->fmt, &adi->info.fmt[0]); 
    550559 
    551560    /* Done */ 
     
    555564 
    556565    return PJ_SUCCESS; 
    557  
    558 on_error: 
    559     avi_dev_strm_destroy(&strm->base); 
    560     return status; 
    561566} 
    562567 
     
    612617    struct avi_dev_strm *stream = (struct avi_dev_strm*)strm; 
    613618     
    614     if (stream->codec) { 
     619    if (stream->adi->codec) { 
    615620        pjmedia_frame enc_frame; 
    616621        pj_status_t status; 
    617622 
    618         enc_frame.buf = stream->enc_buf; 
    619         enc_frame.size = stream->enc_buf_size; 
     623        enc_frame.buf = stream->adi->enc_buf; 
     624        enc_frame.size = stream->adi->enc_buf_size; 
    620625        status = pjmedia_port_get_frame(stream->adi->vid, &enc_frame); 
    621626        if (status != PJ_SUCCESS) 
    622627            return status; 
    623628 
    624         return pjmedia_vid_codec_decode(stream->codec, 1, &enc_frame, 
     629        return pjmedia_vid_codec_decode(stream->adi->codec, 1, &enc_frame, 
    625630                                        frame->size, frame); 
    626631    } else { 
     
    663668    avi_dev_strm_stop(strm); 
    664669 
    665     if (stream->codec) { 
    666         pjmedia_vid_codec_close(stream->codec); 
    667         stream->codec = NULL; 
    668     } 
    669  
    670670    stream->adi->strm = NULL; 
    671671    stream->adi = NULL; 
Note: See TracChangeset for help on using the changeset viewer.