Changeset 207

Show
Ignore:
Timestamp:
01/05/08 20:03:05 (8 months ago)
Author:
sip
Message:

Fixed rev channel, bitrate tolerance and logging

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • app_transcoder/app_transcoder.c

    r206 r207  
    7070        AVCodecContext  *encoderCtx; 
    7171        AVFrame         *encoderPic; 
     72        int             encoderOpened; 
    7273         
    7374        char*   buffer; 
     
    338339        return 0; 
    339340                 
     341} 
     342 
     343static int VideoTranscoderDestroy(struct VideoTranscoder *vtc) 
     344{ 
     345        /* End encoder */ 
     346        vtc->end = 1; 
     347 
     348        /* Wait encoder thread to stop */ 
     349        pthread_join(vtc->encoderThread,0); 
     350 
     351        /* Free pictures */ 
     352        free(vtc->pictures[0]); 
     353        free(vtc->pictures[1]); 
     354 
     355        /* Free frames */ 
     356        free(vtc->frame); 
     357        free(vtc->buffer); 
     358 
     359        /* Free decoder */ 
     360        if (vtc->decoderCtx) 
     361        { 
     362                /*If already open */ 
     363                if (vtc->decoderOpened) 
     364                        /* Close */ 
     365                        avcodec_close(vtc->decoderCtx); 
     366                /* Free */ 
     367                free(vtc->decoderCtx); 
     368        } 
     369        /* Free pic */ 
     370        if (vtc->decoderPic) 
     371                free(vtc->decoderPic); 
     372 
     373        /* Free encoder */ 
     374        if (vtc->encoderCtx) 
     375        { 
     376                /* If encoder opened */ 
     377                if (vtc->encoderOpened) 
     378                        /* Close */ 
     379                        avcodec_close(vtc->encoderCtx); 
     380                free(vtc->encoderCtx); 
     381        } 
     382        /* Free pic */ 
     383        if (vtc->encoderPic) 
     384                free(vtc->encoderPic); 
     385 
     386        /* if got contex */ 
     387        if (vtc->resizeCtx) 
     388                /* Free it */ 
     389                sws_freeContext(vtc->resizeCtx); 
     390 
     391 
     392        /* Free resize buffer*/ 
     393        if (vtc->resizeBuffer) 
     394                /* Free */ 
     395                free(vtc->resizeBuffer); 
     396 
     397        /* Free */ 
     398        free(vtc); 
     399 
     400        /* Exit */ 
     401        return 1; 
    340402} 
    341403 
     
    401463        } 
    402464 
    403         printf("-Transcoder [f=%d,fps=%d,kb=%d,qmin=%d,qmax=%d,gs=%d]\n",vtc->format,vtc->fps,vtc->bitrate,vtc->qMin,vtc->qMax,vtc->gop_size); 
     465        ast_log(LOG_DEBUG,"-Transcoder [f=%d,fps=%d,kb=%d,qmin=%d,qmax=%d,gs=%d]\n",vtc->format,vtc->fps,vtc->bitrate,vtc->qMin,vtc->qMax,vtc->gop_size); 
    404466 
    405467        /* Depending on the format */ 
     
    468530        //vtc->encoderCtx->opaque             = vtc; 
    469531 
    470         /* Bitrate */ 
    471         if (vtc->bitrate>0) 
    472         { 
    473                 /* Set encoder params */ 
    474                 vtc->encoderCtx->bit_rate           = vtc->bitrate; 
    475                 vtc->encoderCtx->bit_rate_tolerance = 1; 
    476         } 
    477  
    478532        /* fps*/ 
    479533        if (vtc->fps>0) 
    480534                /* set encoder params*/ 
    481535                vtc->encoderCtx->time_base          = (AVRational){1,vtc->fps};/* frames per second */ 
     536 
     537        /* Bitrate */ 
     538        if (vtc->bitrate>0 && vtc->fps>0) 
     539        { 
     540                /* Set encoder params */ 
     541                vtc->encoderCtx->bit_rate           = vtc->bitrate; 
     542                vtc->encoderCtx->bit_rate_tolerance = vtc->bitrate*av_q2d(vtc->encoderCtx->time_base) + 1; 
     543        } 
     544 
    482545 
    483546        /* gop size */ 
     
    518581         
    519582        /* Open encoder */ 
    520         avcodec_open(vtc->encoderCtx, vtc->encoder); 
     583        vtc->encoderOpened = avcodec_open(vtc->encoderCtx, vtc->encoder) != -1; 
     584 
     585        /* If not opened correctly */ 
     586        if (!vtc->encoderOpened) 
     587        { 
     588                /* Error */ 
     589                ast_log(LOG_ERROR,"Error opening encoder\n"); 
     590                /* Destroy it */ 
     591                VideoTranscoderDestroy(vtc); 
     592                /* Exit */ 
     593                return NULL;     
     594        } 
    521595 
    522596        /* Start encoder thread */ 
     
    525599        /* Return encoder */ 
    526600        return vtc; 
    527 } 
    528  
    529 static int VideoTranscoderDestroy(struct VideoTranscoder *vtc) 
    530 { 
    531         /* End encoder */ 
    532         vtc->end = 1; 
    533  
    534         /* Wait encoder thread to stop */ 
    535         pthread_join(vtc->encoderThread,0); 
    536  
    537         /* Free pictures */ 
    538         free(vtc->pictures[0]); 
    539         free(vtc->pictures[1]); 
    540  
    541         /* Free frames */ 
    542         free(vtc->frame); 
    543         free(vtc->buffer); 
    544  
    545         /* Free decoder */ 
    546         if (vtc->decoderCtx) 
    547         { 
    548                 /*If already open */ 
    549                 if (vtc->decoderOpened) 
    550                         /* Close */ 
    551                         avcodec_close(vtc->decoderCtx); 
    552                 /* Free */ 
    553                 free(vtc->decoderCtx); 
    554         } 
    555         /* Free pic */ 
    556         if (vtc->decoderPic) 
    557                 free(vtc->decoderPic); 
    558  
    559         /* Free encoder */ 
    560         if (vtc->encoderCtx) 
    561         { 
    562                 /* Close */ 
    563                 avcodec_close(vtc->encoderCtx); 
    564                 free(vtc->encoderCtx); 
    565         } 
    566         /* Free pic */ 
    567         if (vtc->encoderPic) 
    568                 free(vtc->encoderPic); 
    569  
    570         /* if got contex */ 
    571         if (vtc->resizeCtx) 
    572                 /* Free it */ 
    573                 sws_freeContext(vtc->resizeCtx); 
    574  
    575  
    576         /* Free resize buffer*/ 
    577         if (vtc->resizeBuffer) 
    578                 /* Free */ 
    579                 free(vtc->resizeBuffer); 
    580  
    581         /* Free */ 
    582         free(vtc); 
    583  
    584         /* Exit */ 
    585         return 1; 
    586601} 
    587602 
     
    819834 
    820835        }else{ 
    821                 printf("-Unknown codec [%d]\n",codec); 
     836                ast_log(LOG_ERROR,"-Unknown codec [%d]\n",codec); 
    822837                return 0; 
    823838        } 
     
    854869        char *b; 
    855870 
    856  
    857871        /* Find fwd params */ 
    858872        if (!(a=strchr((char*)data,'|'))) 
     
    867881        local     = strndup(a+1,b-a-1); 
    868882        revParams = strndup(b+1,strlen((char*)data)-(b-(char*)data)-1); 
    869  
    870         printf("-transcoding [%s,%s,%s]\n",fwdParams,local,revParams); 
    871  
    872         /* Create contexts */ 
    873         fwd = VideoTranscoderCreate(chan,fwdParams); 
    874         rev = VideoTranscoderCreate(chan,revParams); 
    875883 
    876884        /* Lock module */ 
     
    885893                goto end;  
    886894 
    887         /* Free params */ 
    888         free(fwdParams); 
    889         free(local); 
    890         free(revParams); 
     895        /* Log */ 
     896        ast_log(LOG_WARNING,"Transcoding [%s,%s,%s]\n",fwdParams,local,revParams); 
     897 
     898        /* Create contexts */ 
     899        fwd = VideoTranscoderCreate(pseudo,fwdParams); 
     900        rev = VideoTranscoderCreate(chan,revParams); 
    891901 
    892902        /* Set caller id */ 
     
    10231033 
    10241034end: 
     1035        /* Free params */ 
     1036        free(fwdParams); 
     1037        free(local); 
     1038        free(revParams); 
     1039 
    10251040        /* Destroy transcoders */ 
    10261041        if (fwd) 
     
    10481063        return res; 
    10491064} 
     1065void av_log_asterisk_callback(void* ptr, int level, const char* fmt, va_list vl) 
     1066{ 
     1067        char msg[1024]; 
     1068 
     1069        vsnprintf(msg,1024,fmt,vl); 
     1070 
     1071        AVClass* avc= ptr ? *(AVClass**)ptr : NULL; 
     1072        if(avc) 
     1073                ast_log(LOG_DEBUG,"[%s @ %p] %s",avc->item_name(ptr), avc, msg); 
     1074        else  
     1075                ast_log(LOG_DEBUG, msg); 
     1076} 
    10501077 
    10511078static int load_module(void) 
    10521079{ 
     1080        /* Set log */ 
     1081        av_log_set_callback(av_log_asterisk_callback); 
     1082 
    10531083        /* Init avcodec */ 
    10541084        avcodec_init(); 
Copyright 2006 - Sergio García Murillo
Powered by Trac - Edgewall Software