Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: mp4.c Projeto: chrippa/xmms2
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;
}