* ASF muxer
* Copyright (c) 2000, 2001 Fabrice Bellard
*
- * This file is part of FFmpeg.
+ * This file is part of Libav.
*
- * FFmpeg is free software; you can redistribute it and/or
+ * Libav 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.
*
- * FFmpeg is distributed in the hope that it will be useful,
+ * Libav 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
+ * License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avformat.h"
-#include "metadata.h"
+#include "internal.h"
#include "riff.h"
#include "asf.h"
#include "avio_internal.h"
+#include "libavutil/dict.h"
#undef NDEBUG
#include <assert.h>
} ASFContext;
static const AVCodecTag codec_asf_bmp_tags[] = {
- { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
- { CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
- { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
- { CODEC_ID_NONE, 0 },
+ { AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
+ { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
+ { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
+ { AV_CODEC_ID_NONE, 0 },
};
#define PREROLL_TIME 3100
int len;
uint8_t *pb;
AVIOContext *dyn_buf;
- if (url_open_dyn_buf(&dyn_buf) < 0)
+ if (avio_open_dyn_buf(&dyn_buf) < 0)
return;
avio_put_str16le(dyn_buf, tag);
- len = url_close_dyn_buf(dyn_buf, &pb);
+ len = avio_close_dyn_buf(dyn_buf, &pb);
avio_wl16(s, len);
avio_write(s, pb, len);
av_freep(&pb);
{
int64_t pos;
- pos = url_ftell(pb);
+ pos = avio_tell(pb);
put_guid(pb, g);
avio_wl64(pb, 24);
return pos;
{
int64_t pos1;
- pos1 = url_ftell(pb);
+ pos1 = avio_tell(pb);
avio_seek(pb, pos + 16, SEEK_SET);
avio_wl64(pb, pos1 - pos);
avio_seek(pb, pos1, SEEK_SET);
{
ASFContext *asf = s->priv_data;
AVIOContext *pb = s->pb;
- AVMetadataTag *tags[5];
+ AVDictionaryEntry *tags[5];
int header_size, n, extra_size, extra_size2, wav_extra_size, file_time;
int has_title;
int metadata_count;
ff_metadata_conv(&s->metadata, ff_asf_metadata_conv, NULL);
- tags[0] = av_metadata_get(s->metadata, "title" , NULL, 0);
- tags[1] = av_metadata_get(s->metadata, "author" , NULL, 0);
- tags[2] = av_metadata_get(s->metadata, "copyright", NULL, 0);
- tags[3] = av_metadata_get(s->metadata, "comment" , NULL, 0);
- tags[4] = av_metadata_get(s->metadata, "rating" , NULL, 0);
+ tags[0] = av_dict_get(s->metadata, "title" , NULL, 0);
+ tags[1] = av_dict_get(s->metadata, "author" , NULL, 0);
+ tags[2] = av_dict_get(s->metadata, "copyright", NULL, 0);
+ tags[3] = av_dict_get(s->metadata, "comment" , NULL, 0);
+ tags[4] = av_dict_get(s->metadata, "rating" , NULL, 0);
duration = asf->duration + PREROLL_TIME * 10000;
has_title = tags[0] || tags[1] || tags[2] || tags[3] || tags[4];
- metadata_count = s->metadata ? s->metadata->count : 0;
+ metadata_count = av_dict_count(s->metadata);
bit_rate = 0;
for(n=0;n<s->nb_streams;n++) {
enc = s->streams[n]->codec;
- av_set_pts_info(s->streams[n], 32, 1, 1000); /* 32 bit pts in ms */
+ avpriv_set_pts_info(s->streams[n], 32, 1, 1000); /* 32 bit pts in ms */
bit_rate += enc->bit_rate;
}
avio_w8(pb, 2); /* ??? */
/* file header */
- header_offset = url_ftell(pb);
+ header_offset = avio_tell(pb);
hpos = put_header(pb, &ff_asf_file_header);
put_guid(pb, &ff_asf_my_guid);
avio_wl64(pb, file_size);
avio_wl64(pb, duration); /* end time stamp (in 100ns units) */
avio_wl64(pb, asf->duration); /* duration (in 100ns units) */
avio_wl64(pb, PREROLL_TIME); /* start time stamp */
- avio_wl32(pb, (asf->is_streamed || url_is_streamed(pb)) ? 3 : 2); /* ??? */
+ avio_wl32(pb, (asf->is_streamed || !pb->seekable ) ? 3 : 2); /* ??? */
avio_wl32(pb, s->packet_size); /* packet size */
avio_wl32(pb, s->packet_size); /* packet size */
avio_wl32(pb, bit_rate); /* Nominal data rate in bps */
uint8_t *buf;
AVIOContext *dyn_buf;
- if (url_open_dyn_buf(&dyn_buf) < 0)
+ if (avio_open_dyn_buf(&dyn_buf) < 0)
return AVERROR(ENOMEM);
hpos = put_header(pb, &ff_asf_comment_header);
len = tags[n] ? avio_put_str16le(dyn_buf, tags[n]->value) : 0;
avio_wl16(pb, len);
}
- len = url_close_dyn_buf(dyn_buf, &buf);
+ len = avio_close_dyn_buf(dyn_buf, &buf);
avio_write(pb, buf, len);
av_freep(&buf);
end_header(pb, hpos);
}
if (metadata_count) {
- AVMetadataTag *tag = NULL;
+ AVDictionaryEntry *tag = NULL;
hpos = put_header(pb, &ff_asf_extended_content_header);
avio_wl16(pb, metadata_count);
- while ((tag = av_metadata_get(s->metadata, "", tag, AV_METADATA_IGNORE_SUFFIX))) {
+ while ((tag = av_dict_get(s->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
put_str16(pb, tag->key);
avio_wl16(pb, 0);
put_str16(pb, tag->value);
put_guid(pb, &ff_asf_video_conceal_none);
}
avio_wl64(pb, 0); /* ??? */
- es_pos = url_ftell(pb);
+ es_pos = avio_tell(pb);
avio_wl32(pb, extra_size); /* wav header len */
avio_wl32(pb, extra_size2); /* additional data len */
avio_wl16(pb, n + 1); /* stream number */
if (enc->codec_type == AVMEDIA_TYPE_AUDIO) {
/* WAVEFORMATEX header */
int wavsize = ff_put_wav_header(pb, enc);
- if ((enc->codec_id != CODEC_ID_MP3) && (enc->codec_id != CODEC_ID_MP2) && (enc->codec_id != CODEC_ID_ADPCM_IMA_WAV) && (enc->extradata_size==0)) {
- wavsize += 2;
- avio_wl16(pb, 0);
- }
if (wavsize < 0)
return -1;
if (wavsize != extra_size) {
- cur_pos = url_ftell(pb);
+ cur_pos = avio_tell(pb);
avio_seek(pb, es_pos, SEEK_SET);
avio_wl32(pb, wavsize); /* wav header len */
avio_seek(pb, cur_pos, SEEK_SET);
}
/* ERROR Correction */
avio_w8(pb, 0x01);
- if(enc->codec_id == CODEC_ID_ADPCM_G726 || !enc->block_align){
+ if(enc->codec_id == AV_CODEC_ID_ADPCM_G726 || !enc->block_align){
avio_wl16(pb, 0x0190);
avio_wl16(pb, 0x0190);
}else{
else
avio_wl16(pb, -1);
- if(enc->codec_id == CODEC_ID_WMAV2)
+ if(enc->codec_id == AV_CODEC_ID_WMAV2)
desc = "Windows Media Audio V8";
else
desc = p ? p->name : enc->codec_name;
- if ( url_open_dyn_buf(&dyn_buf) < 0)
+ if ( avio_open_dyn_buf(&dyn_buf) < 0)
return AVERROR(ENOMEM);
avio_put_str16le(dyn_buf, desc);
- len = url_close_dyn_buf(dyn_buf, &buf);
+ len = avio_close_dyn_buf(dyn_buf, &buf);
avio_wl16(pb, len / 2); // "number of characters" = length in bytes / 2
avio_write(pb, buf, len);
/* patch the header size fields */
- cur_pos = url_ftell(pb);
+ cur_pos = avio_tell(pb);
header_size = cur_pos - header_offset;
if (asf->is_streamed) {
header_size += 8 + 30 + 50;
return -1;
}
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
asf->packet_nb_payloads = 0;
asf->packet_timestamp_start = -1;
ASFContext *asf = s->priv_data;
AVIOContext *pb = s->pb;
int ppi_size, i;
- int64_t start= url_ftell(pb);
+ int64_t start= avio_tell(pb);
int iLengthTypeFlags = ASF_PPI_LENGTH_TYPE_FLAGS;
if (asf->multi_payloads_present)
avio_w8(pb, nb_payloads | ASF_PAYLOAD_FLAGS);
- ppi_size = url_ftell(pb) - start;
+ ppi_size = avio_tell(pb) - start;
return ppi_size;
}
avio_write(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
asf->nb_packets++;
asf->packet_nb_payloads = 0;
asf->packet_timestamp_start = -1;
flush_packet(s);
/* write index */
- data_size = url_ftell(s->pb);
+ data_size = avio_tell(s->pb);
if ((!asf->is_streamed) && (asf->nb_index_count != 0)) {
asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->nb_index_count);
}
- put_flush_packet(s->pb);
+ avio_flush(s->pb);
- if (asf->is_streamed || url_is_streamed(s->pb)) {
+ if (asf->is_streamed || !s->pb->seekable) {
put_chunk(s, 0x4524, 0, 0); /* end of stream */
} else {
/* rewrite an updated header */
- file_size = url_ftell(s->pb);
+ file_size = avio_tell(s->pb);
avio_seek(s->pb, 0, SEEK_SET);
asf_write_header1(s, file_size, data_size - asf->data_offset);
}
- put_flush_packet(s->pb);
av_free(asf->index_ptr);
return 0;
}
#if CONFIG_ASF_MUXER
AVOutputFormat ff_asf_muxer = {
- "asf",
- NULL_IF_CONFIG_SMALL("ASF format"),
- "video/x-ms-asf",
- "asf,wmv,wma",
- sizeof(ASFContext),
-#if CONFIG_LIBMP3LAME
- CODEC_ID_MP3,
-#else
- CODEC_ID_MP2,
-#endif
- CODEC_ID_MSMPEG4V3,
- asf_write_header,
- asf_write_packet,
- asf_write_trailer,
- .flags = AVFMT_GLOBALHEADER,
- .codec_tag= (const AVCodecTag* const []){codec_asf_bmp_tags, ff_codec_bmp_tags, ff_codec_wav_tags, 0},
+ .name = "asf",
+ .long_name = NULL_IF_CONFIG_SMALL("ASF (Advanced / Active Streaming Format)"),
+ .mime_type = "video/x-ms-asf",
+ .extensions = "asf,wmv,wma",
+ .priv_data_size = sizeof(ASFContext),
+ .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_MP2,
+ .video_codec = AV_CODEC_ID_MSMPEG4V3,
+ .write_header = asf_write_header,
+ .write_packet = asf_write_packet,
+ .write_trailer = asf_write_trailer,
+ .flags = AVFMT_GLOBALHEADER,
+ .codec_tag = (const AVCodecTag* const []){
+ codec_asf_bmp_tags, ff_codec_bmp_tags, ff_codec_wav_tags, 0
+ },
};
#endif
#if CONFIG_ASF_STREAM_MUXER
AVOutputFormat ff_asf_stream_muxer = {
- "asf_stream",
- NULL_IF_CONFIG_SMALL("ASF format"),
- "video/x-ms-asf",
- "asf,wmv,wma",
- sizeof(ASFContext),
-#if CONFIG_LIBMP3LAME
- CODEC_ID_MP3,
-#else
- CODEC_ID_MP2,
-#endif
- CODEC_ID_MSMPEG4V3,
- asf_write_stream_header,
- asf_write_packet,
- asf_write_trailer,
- .flags = AVFMT_GLOBALHEADER,
- .codec_tag= (const AVCodecTag* const []){codec_asf_bmp_tags, ff_codec_bmp_tags, ff_codec_wav_tags, 0},
+ .name = "asf_stream",
+ .long_name = NULL_IF_CONFIG_SMALL("ASF (Advanced / Active Streaming Format)"),
+ .mime_type = "video/x-ms-asf",
+ .extensions = "asf,wmv,wma",
+ .priv_data_size = sizeof(ASFContext),
+ .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_MP2,
+ .video_codec = AV_CODEC_ID_MSMPEG4V3,
+ .write_header = asf_write_stream_header,
+ .write_packet = asf_write_packet,
+ .write_trailer = asf_write_trailer,
+ .flags = AVFMT_GLOBALHEADER,
+ .codec_tag = (const AVCodecTag* const []){
+ codec_asf_bmp_tags, ff_codec_bmp_tags, ff_codec_wav_tags, 0
+ },
};
#endif //CONFIG_ASF_STREAM_MUXER