static int write_video_data(struct ALL_DATA *all_data, BYTE *buff, int size) { struct VideoFormatData *videoF = all_data->videoF; struct GLOBAL *global = all_data->global; int ret =0; __LOCK_MUTEX( __FMUTEX ); switch (global->VidFormat) { case AVI_FORMAT: if(size > 0) ret = avi_write_packet(videoF->avi, 0, buff, size, videoF->vdts, videoF->vblock_align, videoF->vflags); //ret = AVI_write_frame (videoF->AviOut, buff, size, videoF->keyframe); break; case WEBM_FORMAT: case MKV_FORMAT: if(size > 0) { ret = mkv_write_packet(videoF->mkv, 0, buff, size, videoF->vduration, videoF->vpts, videoF->vflags); //ret = write_video_packet (buff, size, global->fps, videoF); } break; default: break; } __UNLOCK_MUTEX( __FMUTEX ); return (ret); }
/* * mux a audio frame * args: * encoder_ctx - pointer to encoder context * * asserts: * encoder_ctx is not null; * * returns: error code */ int encoder_write_audio_data(encoder_context_t *encoder_ctx) { /*assertions*/ assert(encoder_ctx != NULL); encoder_audio_context_t *enc_audio_ctx = encoder_ctx->enc_audio_ctx; if(!enc_audio_ctx || encoder_ctx->audio_channels <= 0) return -1; if(verbosity > 3) printf("ENCODER: writing %i bytes of audio data\n", enc_audio_ctx->outbuf_coded_size); if(enc_audio_ctx->outbuf_coded_size <= 0) return -1; int ret =0; int block_align = 1; encoder_codec_data_t *audio_codec_data = (encoder_codec_data_t *) enc_audio_ctx->codec_data; if(audio_codec_data) block_align = audio_codec_data->codec_context->block_align; __LOCK_MUTEX( __PMUTEX ); switch (encoder_ctx->muxer_id) { case ENCODER_MUX_AVI: ret = avi_write_packet( avi_ctx, 1, enc_audio_ctx->outbuf, enc_audio_ctx->outbuf_coded_size, enc_audio_ctx->dts, block_align, enc_audio_ctx->flags); break; case ENCODER_MUX_MKV: case ENCODER_MUX_WEBM: ret = mkv_write_packet( mkv_ctx, 1, enc_audio_ctx->outbuf, enc_audio_ctx->outbuf_coded_size, enc_audio_ctx->duration, enc_audio_ctx->pts, enc_audio_ctx->flags); break; default: break; } __UNLOCK_MUTEX( __PMUTEX ); return (ret); }
/* * mux a video frame * args: * encoder_ctx - pointer to encoder context * * asserts: * encoder_ctx is not null; * * returns: error code */ int encoder_write_video_data(encoder_context_t *encoder_ctx) { /*assertions*/ assert(encoder_ctx); encoder_video_context_t *enc_video_ctx = encoder_ctx->enc_video_ctx; assert(enc_video_ctx); if(enc_video_ctx->outbuf_coded_size <= 0) return -1; enc_video_ctx->framecount++; int ret =0; int block_align = 1; encoder_codec_data_t *video_codec_data = (encoder_codec_data_t *) enc_video_ctx->codec_data; if(video_codec_data) block_align = video_codec_data->codec_context->block_align; __LOCK_MUTEX( __PMUTEX ); switch (encoder_ctx->muxer_id) { case ENCODER_MUX_AVI: ret = avi_write_packet( avi_ctx, 0, enc_video_ctx->outbuf, enc_video_ctx->outbuf_coded_size, enc_video_ctx->dts, block_align, enc_video_ctx->flags); break; case ENCODER_MUX_MKV: case ENCODER_MUX_WEBM: ret = mkv_write_packet( mkv_ctx, 0, enc_video_ctx->outbuf, enc_video_ctx->outbuf_coded_size, enc_video_ctx->duration, enc_video_ctx->pts, enc_video_ctx->flags); break; default: break; } __UNLOCK_MUTEX( __PMUTEX ); return (ret); }