diff options
author | prigaux <[email protected]> | 2007-02-11 20:00:15 +0000 |
---|---|---|
committer | prigaux <[email protected]> | 2007-02-11 20:00:15 +0000 |
commit | a74fd5a1ec37e53fe7008f022639af6ede0e82c9 (patch) | |
tree | 0a6a32640a840b72653149aa11efa264674df976 /libhb/encavcodec.c | |
parent | f45dfeb2afb1b0bf46054959e8ea9494f3b7d14f (diff) |
Merge the 0.8.0_mpeg4ip branch into the trunk
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@285 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/encavcodec.c')
-rw-r--r-- | libhb/encavcodec.c | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/libhb/encavcodec.c b/libhb/encavcodec.c deleted file mode 100644 index f04606906..000000000 --- a/libhb/encavcodec.c +++ /dev/null @@ -1,195 +0,0 @@ -/* $Id: encavcodec.c,v 1.23 2005/10/13 23:47:06 titer Exp $ - - This file is part of the HandBrake source code. - Homepage: <http://handbrake.m0k.org/>. - It may be used under the terms of the GNU General Public License. */ - -#include "hb.h" - -#include "ffmpeg/avcodec.h" - -struct hb_work_private_s -{ - hb_job_t * job; - AVCodecContext * context; - FILE * file; -}; - -int encavcodecInit( hb_work_object_t *, hb_job_t * ); -int encavcodecWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** ); -void encavcodecClose( hb_work_object_t * ); - -hb_work_object_t hb_encavcodec = -{ - WORK_ENCAVCODEC, - "MPEG-4 encoder (libavcodec)", - encavcodecInit, - encavcodecWork, - encavcodecClose -}; - -int encavcodecInit( hb_work_object_t * w, hb_job_t * job ) -{ - AVCodec * codec; - AVCodecContext * context; - - hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) ); - w->private_data = pv; - - pv->job = job; - - codec = avcodec_find_encoder( CODEC_ID_MPEG4 ); - if( !codec ) - { - hb_log( "hb_work_encavcodec_init: avcodec_find_encoder " - "failed" ); - } - context = avcodec_alloc_context(); - if( job->vquality < 0.0 || job->vquality > 1.0 ) - { - /* Rate control */ - context->bit_rate = 1000 * job->vbitrate; - context->bit_rate_tolerance = 10 * context->bit_rate; - } - else - { - /* Constant quantizer */ - context->qmin = 31 - job->vquality * 30; - context->qmax = context->qmin; - hb_log( "encavcodec: encoding at constant quantizer %d", - context->qmin ); - } - context->width = job->width; - context->height = job->height; - context->time_base = (AVRational) { job->vrate_base, job->vrate }; - context->gop_size = 10 * job->vrate / job->vrate_base; - context->pix_fmt = PIX_FMT_YUV420P; - - if( job->mux & ( HB_MUX_MP4 | HB_MUX_PSP ) ) - { - context->flags |= CODEC_FLAG_GLOBAL_HEADER; - } - if( job->mux & HB_MUX_PSP ) - { - context->flags |= CODEC_FLAG_BITEXACT; - } - if( job->grayscale ) - { - context->flags |= CODEC_FLAG_GRAY; - } - - if( job->pass ) - { - char filename[1024]; memset( filename, 0, 1024 ); - hb_get_tempory_filename( job->h, filename, "ffmpeg.log" ); - - if( job->pass == 1 ) - { - pv->file = fopen( filename, "wb" ); - context->flags |= CODEC_FLAG_PASS1; - } - else - { - int size; - char * log; - - pv->file = fopen( filename, "rb" ); - fseek( pv->file, 0, SEEK_END ); - size = ftell( pv->file ); - fseek( pv->file, 0, SEEK_SET ); - log = malloc( size + 1 ); - log[size] = '\0'; - fread( log, size, 1, pv->file ); - fclose( pv->file ); - pv->file = NULL; - - context->flags |= CODEC_FLAG_PASS2; - context->stats_in = log; - } - } - - if( avcodec_open( context, codec ) ) - { - hb_log( "hb_work_encavcodec_init: avcodec_open failed" ); - } - pv->context = context; - - if( ( job->mux & ( HB_MUX_MP4 | HB_MUX_PSP ) ) && job->pass != 1 ) - { -#if 0 - /* Hem hem */ - w->config->mpeg4.length = 15; - memcpy( w->config->mpeg4.bytes, context->extradata + 15, 15 ); -#else - w->config->mpeg4.length = context->extradata_size; - memcpy( w->config->mpeg4.bytes, context->extradata, - context->extradata_size ); -#endif - } - - return 0; -} - -/*********************************************************************** - * Close - *********************************************************************** - * - **********************************************************************/ -void encavcodecClose( hb_work_object_t * w ) -{ - hb_work_private_t * pv = w->private_data; - - if( pv->context ) - { - hb_log( "encavcodec: closing libavcodec" ); - avcodec_close( pv->context ); - } - if( pv->file ) - { - fclose( pv->file ); - } -} - -/*********************************************************************** - * Work - *********************************************************************** - * - **********************************************************************/ -int encavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in, - hb_buffer_t ** buf_out ) -{ - hb_work_private_t * pv = w->private_data; - hb_job_t * job = pv->job; - AVFrame * frame; - hb_buffer_t * in = *buf_in, * buf; - - frame = avcodec_alloc_frame(); - frame->data[0] = in->data; - frame->data[1] = frame->data[0] + job->width * job->height; - frame->data[2] = frame->data[1] + job->width * job->height / 4; - frame->linesize[0] = job->width; - frame->linesize[1] = job->width / 2; - frame->linesize[2] = job->width / 2; - - /* Should be way too large */ - buf = hb_buffer_init( 3 * job->width * job->height / 2 ); - buf->size = avcodec_encode_video( pv->context, buf->data, buf->alloc, - frame ); - buf->start = in->start; - buf->stop = in->stop; - buf->key = pv->context->coded_frame->key_frame; - - av_free( frame ); - - if( job->pass == 1 ) - { - /* Write stats */ - fprintf( pv->file, "%s", pv->context->stats_out ); - } - - *buf_out = buf; - - return HB_WORK_OK; -} - - |