/*****************************************************************************
* flac.c : FLAC demux module for vlc
*****************************************************************************
- * Copyright (C) 2001-2007 the VideoLAN team
+ * Copyright (C) 2001-2008 VLC authors and VideoLAN
* $Id$
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
* Laurent Aimar <fenrir@via.ecp.fr>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_demux.h>
-#include <vlc_meta.h>
-#include <vlc_input.h>
-#include <vlc_codec.h>
+#include <vlc_meta.h> /* vlc_meta_* */
+#include <vlc_input.h> /* vlc_input_attachment, vlc_seekpoint */
+#include <vlc_codec.h> /* decoder_t */
+#include <vlc_charset.h> /* EnsureUTF8 */
+
#include <assert.h>
-#include <vlc_charset.h>
-#include "vorbis.h"
+#include "vorbis.h" /* vorbis comments */
/*****************************************************************************
* Module descriptor
"continuing anyway" );
}
+ p_sys = malloc( sizeof( demux_sys_t ) );
+ if( unlikely(p_sys == NULL) )
+ return VLC_ENOMEM;
+
p_demux->pf_demux = Demux;
p_demux->pf_control = Control;
- p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
+ p_demux->p_sys = p_sys;
p_sys->b_start = true;
p_sys->p_meta = NULL;
memset( &p_sys->replay_gain, 0, sizeof(p_sys->replay_gain) );
if( !( p_block_in = stream_Block( p_demux->s, FLAC_PACKET_SIZE ) ) )
return 0;
- p_block_in->i_pts = p_block_in->i_dts = p_sys->b_start ? 1 : 0;
+ p_block_in->i_pts = p_block_in->i_dts = p_sys->b_start ? VLC_TS_0 : VLC_TS_INVALID;
p_sys->b_start = false;
while( (p_block_out = p_sys->p_packetizer->pf_packetize(
p_sys->p_es = es_out_Add( p_demux->out, &p_sys->p_packetizer->fmt_out);
}
- p_sys->i_pts = p_block_out->i_dts;
+ p_sys->i_pts = p_block_out->i_dts - VLC_TS_0;
/* Correct timestamp */
p_block_out->i_pts += p_sys->i_time_offset;
double *pf = (double*)va_arg( args, double * );
const int64_t i_length = ControlGetLength(p_demux);
if( i_length > 0 )
- *pf = (double)ControlGetTime(p_demux) / (double)i_length;
+ {
+ double current = ControlGetTime(p_demux);
+ *pf = current / (double)i_length;
+ }
else
*pf= 0.0;
return VLC_SUCCESS;
input_attachment_t ***ppp_attach =
(input_attachment_t***)va_arg( args, input_attachment_t*** );
int *pi_int = (int*)va_arg( args, int * );
- int i;
if( p_sys->i_attachments <= 0 )
return VLC_EGENERIC;
- *pi_int = p_sys->i_attachments;;
- *ppp_attach = malloc( sizeof(input_attachment_t**) * p_sys->i_attachments );
- for( i = 0; i < p_sys->i_attachments; i++ )
+ *pi_int = p_sys->i_attachments;
+ *ppp_attach = xmalloc( sizeof(input_attachment_t**) * p_sys->i_attachments );
+ for( int i = 0; i < p_sys->i_attachments; i++ )
(*ppp_attach)[i] = vlc_input_attachment_Duplicate( p_sys->attachments[i] );
return VLC_SUCCESS;
}
/* TODO sort it by size and remove wrong seek entry (time not increasing) */
}
-#define RM(x) do { i_data -= (x); p_data += (x); } while(0)
static void ParseComment( demux_t *p_demux, const uint8_t *p_data, int i_data )
{
demux_sys_t *p_sys = p_demux->p_sys;
if( i_data < 4 )
return;
- vorbis_ParseComment( &p_sys->p_meta, &p_data[4], i_data - 4 );
+ vorbis_ParseComment( &p_sys->p_meta, &p_data[4], i_data - 4, NULL, NULL, NULL, NULL );
}
};
demux_sys_t *p_sys = p_demux->p_sys;
int i_type;
- int i_len;
- char *psz_mime = NULL;
- char *psz_description = NULL;
- input_attachment_t *p_attachment;
- char psz_name[128];
- if( i_data < 4 + 3*4 )
+ i_data -= 4; p_data += 4;
+
+ input_attachment_t *p_attachment = ParseFlacPicture( p_data, i_data, p_sys->i_attachments, &i_type );
+ if( p_attachment == NULL )
return;
-#define RM(x) do { i_data -= (x); p_data += (x); } while(0)
- RM(4);
-
- i_type = GetDWBE( p_data ); RM(4);
- i_len = GetDWBE( p_data ); RM(4);
- if( i_len < 0 || i_data < i_len + 4 )
- goto error;
- psz_mime = strndup( (const char*)p_data, i_len ); RM(i_len);
- i_len = GetDWBE( p_data ); RM(4);
- if( i_len < 0 || i_data < i_len + 4*4 + 4)
- goto error;
- psz_description = strndup( (const char*)p_data, i_len ); RM(i_len);
- EnsureUTF8( psz_description );
- RM(4*4);
- i_len = GetDWBE( p_data ); RM(4);
- if( i_len < 0 || i_len > i_data )
- goto error;
-
- msg_Dbg( p_demux, "FLAC: Picture type=%d mime=%s description='%s' file length=%d",
- i_type, psz_mime, psz_description, i_len );
-
- snprintf( psz_name, sizeof(psz_name), "picture%d", p_sys->i_attachments );
- if( !strcasecmp( psz_mime, "image/jpeg" ) )
- strcat( psz_name, ".jpg" );
- else if( !strcasecmp( psz_mime, "image/png" ) )
- strcat( psz_name, ".png" );
-
- p_attachment = vlc_input_attachment_New( psz_name, psz_mime, psz_description,
- p_data, i_data );
+
TAB_APPEND( p_sys->i_attachments, p_sys->attachments, p_attachment );
if( i_type >= 0 && (unsigned int)i_type < sizeof(pi_cover_score)/sizeof(pi_cover_score[0]) &&
p_sys->i_cover_idx = p_sys->i_attachments-1;
p_sys->i_cover_score = pi_cover_score[i_type];
}
-error:
- free( psz_mime );
- free( psz_description );
}
-#undef RM