1 /*****************************************************************************
2 * avformat.c: demuxer and muxer using libavformat library
3 *****************************************************************************
4 * Copyright (C) 1999-2008 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
32 #include <vlc_common.h>
33 #include <vlc_plugin.h>
34 #include <vlc_codec.h>
38 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
39 # include <libavcodec/avcodec.h>
40 #elif defined(HAVE_FFMPEG_AVCODEC_H)
41 # include <ffmpeg/avcodec.h>
46 #if LIBAVCODEC_BUILD < 5000
47 # error You must have a libavcodec >= 5000 (get CVS)
52 /*****************************************************************************
54 *****************************************************************************/
56 add_shortcut( "ffmpeg" );
57 set_category( CAT_INPUT );
58 set_subcategory( SUBCAT_INPUT_SCODEC );
59 set_description( N_("FFmpeg demuxer" ) );
60 set_capability( "demux", 2 );
61 set_callbacks( OpenDemux, CloseDemux );
66 set_description( N_("FFmpeg muxer" ) );
67 set_capability( "sout mux", 2 );
68 add_string( "ffmpeg-mux", NULL, NULL, MUX_TEXT,
70 set_callbacks( OpenMux, CloseMux );
74 /*****************************************************************************
76 *****************************************************************************/
77 void LibavcodecCallback( void *p_opaque, int i_level,
78 const char *psz_format, va_list va )
81 AVCodecContext *p_avctx = (AVCodecContext *)p_opaque;
85 const char *psz_item_name;
87 p_avc = p_avctx ? p_avctx->av_class : 0;
89 #define cln p_avc->class_name
90 /* Make sure we can get p_this back */
91 if( !p_avctx || !p_avc || !cln ||
92 cln[0]!='A' || cln[1]!='V' || cln[2]!='C' || cln[3]!='o' ||
93 cln[4]!='d' || cln[5]!='e' || cln[6]!='c' )
95 if( i_level == AV_LOG_ERROR ) vfprintf( stderr, psz_format, va );
100 p_this = (vlc_object_t *)p_avctx->opaque;
105 i_vlc_level = VLC_MSG_ERR;
108 i_vlc_level = VLC_MSG_WARN;
111 i_vlc_level = VLC_MSG_DBG;
114 /* Print debug messages if they were requested */
115 if( p_avctx->debug ) vfprintf( stderr, psz_format, va );
121 psz_item_name = p_avc->item_name(p_opaque);
122 psz_new_format = malloc( strlen(psz_format) + strlen(psz_item_name)
124 snprintf( psz_new_format, strlen(psz_format) + strlen(psz_item_name)
125 + 18 + 5, "%s (%s@%p)", psz_format, p_avc->item_name(p_opaque), p_opaque );
126 msg_GenericVa( p_this, i_vlc_level,
127 MODULE_STRING, psz_new_format, va );
128 free( psz_new_format );
131 void InitLibavcodec( vlc_object_t *p_object )
133 static int b_ffmpeginit = 0;
134 vlc_mutex_t *lock = var_AcquireMutex( "avcodec" );
136 /* *** init ffmpeg library (libavcodec) *** */
140 avcodec_register_all();
141 av_log_set_callback( LibavcodecCallback );
144 msg_Dbg( p_object, "libavcodec initialized (interface %d )",
145 LIBAVCODEC_VERSION_INT );
149 msg_Dbg( p_object, "libavcodec already initialized" );
152 vlc_mutex_unlock( lock );