gint xmms_asf_get_track (xmms_xform_t *xform, asf_file_t *file) { xmms_asf_data_t *data; uint8_t stream_count; gint i; g_return_val_if_fail (xform, -1); data = xmms_xform_private_data_get (xform); g_return_val_if_fail (data, -1); stream_count = asf_get_stream_count (file); for (i=1; i <= stream_count; i++) { asf_stream_t *stream = asf_get_stream (file, i); if (stream->type == ASF_STREAM_TYPE_AUDIO && !(stream->flags & ASF_STREAM_FLAG_HIDDEN)) { asf_waveformatex_t *wfx = stream->properties; const gchar *mimetype; if (wfx->wFormatTag == 0x160) mimetype = "audio/x-ffmpeg-wmav1"; else if (wfx->wFormatTag == 0x161) mimetype = "audio/x-ffmpeg-wmav2"; else continue; data->samplerate = wfx->nSamplesPerSec; data->channels = wfx->nChannels; data->bitrate = wfx->nAvgBytesPerSec * 8; xmms_xform_auxdata_set_bin (xform, "decoder_config", wfx->data, wfx->cbSize); xmms_xform_auxdata_set_int (xform, "block_align", wfx->nBlockAlign); xmms_xform_auxdata_set_int (xform, "bitrate", data->bitrate); xmms_xform_outdata_type_add (xform, XMMS_STREAM_TYPE_MIMETYPE, mimetype, XMMS_STREAM_TYPE_FMT_SAMPLERATE, data->samplerate, XMMS_STREAM_TYPE_FMT_CHANNELS, data->channels, XMMS_STREAM_TYPE_END); return i; } } return -1; }
static gboolean xmms_mp4_init (xmms_xform_t *xform) { xmms_mp4_data_t *data; xmms_error_t error; gint bytes_read; guchar *tmpbuf; guint tmpbuflen; g_return_val_if_fail (xform, FALSE); data = g_new0 (xmms_mp4_data_t, 1); data->outbuf = g_string_new (NULL); data->buffer_size = MP4_BUFFER_SIZE; xmms_xform_private_data_set (xform, data); data->sampleid = 1; data->numsamples = 0; bytes_read = xmms_xform_read (xform, (gchar *) data->buffer + data->buffer_length, data->buffer_size - data->buffer_length, &error); data->buffer_length += bytes_read; if (bytes_read < 8) { XMMS_DBG ("Not enough bytes to check the MP4 header"); goto err; } /* * MP4 not supported (yet) on non-seekable transport * this needs little tweaking in mp4ff at least */ if (xmms_xform_seek (xform, 0, XMMS_XFORM_SEEK_CUR, &error) < 0) { XMMS_DBG ("Non-seekable transport on MP4 not yet supported"); goto err; } data->mp4ff_cb = g_new0 (mp4ff_callback_t, 1); data->mp4ff_cb->read = xmms_mp4_read_callback; data->mp4ff_cb->seek = xmms_mp4_seek_callback; data->mp4ff_cb->user_data = xform; data->mp4ff = mp4ff_open_read (data->mp4ff_cb); if (!data->mp4ff) { XMMS_DBG ("Error opening mp4 demuxer\n"); goto err;; } data->track = xmms_mp4_get_track (xform, data->mp4ff); if (data->track < 0) { XMMS_DBG ("Can't find suitable audio track from MP4 file\n"); goto err; } data->numsamples = mp4ff_num_samples (data->mp4ff, data->track); mp4ff_get_decoder_config (data->mp4ff, data->track, &tmpbuf, &tmpbuflen); xmms_xform_auxdata_set_bin (xform, "decoder_config", tmpbuf, tmpbuflen); g_free (tmpbuf); xmms_mp4_get_mediainfo (xform); XMMS_DBG ("MP4 demuxer inited successfully!"); return TRUE; err: g_free (data->mp4ff_cb); g_string_free (data->outbuf, TRUE); g_free (data); return FALSE; }