Esempio n. 1
0
static int mmf_write_header(AVFormatContext *s)
{
    MMFContext *mmf = s->priv_data;
    AVIOContext *pb = s->pb;
    int64_t pos;
    int rate;

    rate = mmf_rate_code(s->streams[0]->codec->sample_rate);
    if (rate < 0) {
        av_log(s, AV_LOG_ERROR, "Unsupported sample rate %d\n",
               s->streams[0]->codec->sample_rate);
        return -1;
    }

    ffio_wfourcc(pb, "MMMD");
    avio_wb32(pb, 0);
    pos = ff_start_tag(pb, "CNTI");
    avio_w8(pb, 0); /* class */
    avio_w8(pb, 0); /* type */
    avio_w8(pb, 0); /* code type */
    avio_w8(pb, 0); /* status */
    avio_w8(pb, 0); /* counts */
    end_tag_be(pb, pos);

    pos = ff_start_tag(pb, "OPDA");
    avio_write(pb, "VN:libavcodec,", sizeof("VN:libavcodec,") -1); /* metadata ("ST:songtitle,VN:version,...") */
    end_tag_be(pb, pos);

    avio_write(pb, "ATR\x00", 4);
    avio_wb32(pb, 0);
    mmf->atrpos = avio_tell(pb);
    avio_w8(pb, 0); /* format type */
    avio_w8(pb, 0); /* sequence type */
    avio_w8(pb, (0 << 7) | (1 << 4) | rate); /* (channel << 7) | (format << 4) | rate */
    avio_w8(pb, 0); /* wave base bit */
    avio_w8(pb, 2); /* time base d */
    avio_w8(pb, 2); /* time base g */

    ffio_wfourcc(pb, "Atsq");
    avio_wb32(pb, 16);
    mmf->atsqpos = avio_tell(pb);
    /* Will be filled on close */
    avio_write(pb, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16);

    mmf->awapos = ff_start_tag(pb, "Awa\x01");

    avpriv_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);

    avio_flush(pb);

    return 0;
}
Esempio n. 2
0
static int mmf_write_trailer(AVFormatContext *s)
{
	AVIOContext *pb = s->pb;
	MMFContext *mmf = s->priv_data;
	int64_t pos, size;
	int gatetime;

	if (s->pb->seekable)
	{
		/* Fill in length fields */
		end_tag_be(pb, mmf->awapos);
		end_tag_be(pb, mmf->atrpos);
		end_tag_be(pb, 8);

		pos = avio_tell(pb);
		size = pos - mmf->awapos;

		/* Fill Atsq chunk */
		avio_seek(pb, mmf->atsqpos, SEEK_SET);

		/* "play wav" */
		avio_w8(pb, 0); /* start time */
		avio_w8(pb, 1); /* (channel << 6) | wavenum */
		gatetime = size * 500 / s->streams[0]->codec->sample_rate;
		put_varlength(pb, gatetime); /* duration */

		/* "nop" */
		put_varlength(pb, gatetime); /* start time */
		avio_write(pb, "\xff\x00", 2); /* nop */

		/* "end of sequence" */
		avio_write(pb, "\x00\x00\x00\x00", 4);

		avio_seek(pb, pos, SEEK_SET);

		avio_flush(pb);
	}
	return 0;
}
Esempio n. 3
0
File: mmf.c Progetto: apeliom/tikitv
static int mmf_write_trailer(AVFormatContext *s)
{
    ByteIOContext *pb = s->pb;
    MMFContext *mmf = s->priv_data;
    offset_t pos, size;
    int gatetime;

    if (!url_is_streamed(s->pb)) {
        /* Fill in length fields */
        end_tag_be(pb, mmf->awapos);
        end_tag_be(pb, mmf->atrpos);
        end_tag_be(pb, 8);

        pos = url_ftell(pb);
        size = pos - mmf->awapos;

        /* Fill Atsq chunk */
        url_fseek(pb, mmf->atsqpos, SEEK_SET);

        /* "play wav" */
        put_byte(pb, 0); /* start time */
        put_byte(pb, 1); /* (channel << 6) | wavenum */
        gatetime = size * 500 / s->streams[0]->codec->sample_rate;
        put_varlength(pb, gatetime); /* duration */

        /* "nop" */
        put_varlength(pb, gatetime); /* start time */
        put_buffer(pb, "\xff\x00", 2); /* nop */

        /* "end of sequence" */
        put_buffer(pb, "\x00\x00\x00\x00", 4);

        url_fseek(pb, pos, SEEK_SET);

        put_flush_packet(pb);
    }
    return 0;
}