*/
#include "libavutil/intreadwrite.h"
+#include "libavutil/mathematics.h"
#include "libavutil/tree.h"
+#include "libavutil/dict.h"
#include "libavcodec/mpegaudiodata.h"
#include "nut.h"
#include "internal.h"
else if(sample_rate < (44100 + 48000)/2) sample_rate_index=0;
else sample_rate_index=1;
- sample_rate= ff_mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25);
+ sample_rate= avpriv_mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25);
for(bitrate_index=2; bitrate_index<30; bitrate_index++){
- frame_size = ff_mpa_bitrate_tab[lsf][layer-1][bitrate_index>>1];
+ frame_size = avpriv_mpa_bitrate_tab[lsf][layer-1][bitrate_index>>1];
frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1);
if(frame_size == size)
}
key_frame= intra_only;
-#if 1
if(is_audio){
int frame_bytes= codec->frame_size*(int64_t)codec->bit_rate / (8*codec->sample_rate);
int pts;
ft->pts_delta=1;
start2++;
}
-#endif
if(codec->has_b_frames){
pred_count=5;
//FIXME remove calculate_checksum
static void put_packet(NUTContext *nut, AVIOContext *bc, AVIOContext *dyn_bc, int calculate_checksum, uint64_t startcode){
uint8_t *dyn_buf=NULL;
- int dyn_size= url_close_dyn_buf(dyn_bc, &dyn_buf);
+ int dyn_size= avio_close_dyn_buf(dyn_bc, &dyn_buf);
int forw_ptr= dyn_size + 4*calculate_checksum;
if(forw_ptr > 4096)
avio_wb64(bc, startcode);
ff_put_v(bc, forw_ptr);
if(forw_ptr > 4096)
- avio_wl32(bc, get_checksum(bc));
+ avio_wl32(bc, ffio_get_checksum(bc));
if(calculate_checksum)
ffio_init_checksum(bc, ff_crc04C11DB7_update, 0);
avio_write(bc, dyn_buf, dyn_size);
if(calculate_checksum)
- avio_wl32(bc, get_checksum(bc));
+ avio_wl32(bc, ffio_get_checksum(bc));
av_free(dyn_buf);
}
static int write_globalinfo(NUTContext *nut, AVIOContext *bc){
AVFormatContext *s= nut->avf;
- AVMetadataTag *t = NULL;
+ AVDictionaryEntry *t = NULL;
AVIOContext *dyn_bc;
uint8_t *dyn_buf=NULL;
int count=0, dyn_size;
- int ret = url_open_dyn_buf(&dyn_bc);
+ int ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
- while ((t = av_metadata_get(s->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
+ while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
count += add_info(dyn_bc, t->key, t->value);
ff_put_v(bc, 0); //stream_if_plus1
ff_put_v(bc, count);
- dyn_size= url_close_dyn_buf(dyn_bc, &dyn_buf);
+ dyn_size= avio_close_dyn_buf(dyn_bc, &dyn_buf);
avio_write(bc, dyn_buf, dyn_size);
av_free(dyn_buf);
return 0;
AVIOContext *dyn_bc;
uint8_t *dyn_buf=NULL;
int count=0, dyn_size, i;
- int ret = url_open_dyn_buf(&dyn_bc);
+ int ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
if (st->disposition & ff_nut_dispositions[i].flag)
count += add_info(dyn_bc, "Disposition", ff_nut_dispositions[i].str);
}
- dyn_size = url_close_dyn_buf(dyn_bc, &dyn_buf);
+ dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
if (count) {
ff_put_v(bc, stream_id + 1); //stream_id_plus1
{
AVIOContext *dyn_bc;
uint8_t *dyn_buf = NULL;
- AVMetadataTag *t = NULL;
+ AVDictionaryEntry *t = NULL;
AVChapter *ch = nut->avf->chapters[id];
int ret, dyn_size, count = 0;
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if (ret < 0)
return ret;
put_tt(nut, nut->chapter[id].time_base, bc, ch->start); // chapter_start
ff_put_v(bc, ch->end - ch->start); // chapter_len
- while ((t = av_metadata_get(ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
+ while ((t = av_dict_get(ch->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
count += add_info(dyn_bc, t->key, t->value);
ff_put_v(bc, count);
- dyn_size = url_close_dyn_buf(dyn_bc, &dyn_buf);
+ dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
avio_write(bc, dyn_buf, dyn_size);
av_freep(&dyn_buf);
return 0;
ff_metadata_conv_ctx(avctx, ff_nut_metadata_conv, NULL);
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
write_mainheader(nut, dyn_bc);
put_packet(nut, bc, dyn_bc, 1, MAIN_STARTCODE);
for (i=0; i < nut->avf->nb_streams; i++){
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
if ((ret = write_streamheader(avctx, dyn_bc, nut->avf->streams[i], i)) < 0)
put_packet(nut, bc, dyn_bc, 1, STREAM_STARTCODE);
}
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
write_globalinfo(nut, dyn_bc);
put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
for (i = 0; i < nut->avf->nb_streams; i++) {
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
ret = write_streaminfo(nut, dyn_bc, i);
put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
else {
uint8_t* buf;
- url_close_dyn_buf(dyn_bc, &buf);
+ avio_close_dyn_buf(dyn_bc, &buf);
av_free(buf);
}
}
for (i = 0; i < nut->avf->nb_chapters; i++) {
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if (ret < 0)
return ret;
ret = write_chapter(nut, dyn_bc, i);
if (ret < 0) {
uint8_t *buf;
- url_close_dyn_buf(dyn_bc, &buf);
+ avio_close_dyn_buf(dyn_bc, &buf);
av_freep(&buf);
return ret;
}
return 0;
}
-static int write_header(AVFormatContext *s){
+static int nut_write_header(AVFormatContext *s){
NUTContext *nut = s->priv_data;
AVIOContext *bc = s->pb;
int i, j, ret;
nut->avf= s;
nut->stream = av_mallocz(sizeof(StreamContext)*s->nb_streams);
- nut->chapter = av_mallocz(sizeof(ChapterContext)*s->nb_chapters);
+ if (s->nb_chapters)
+ nut->chapter = av_mallocz(sizeof(ChapterContext)*s->nb_chapters);
nut->time_base= av_mallocz(sizeof(AVRational )*(s->nb_streams +
s->nb_chapters));
+ if (!nut->stream || (s->nb_chapters && !nut->chapter) || !nut->time_base) {
+ av_freep(&nut->stream);
+ av_freep(&nut->chapter);
+ av_freep(&nut->time_base);
+ return AVERROR(ENOMEM);
+ }
for(i=0; i<s->nb_streams; i++){
AVStream *st= s->streams[i];
return best_i;
}
-static int write_packet(AVFormatContext *s, AVPacket *pkt){
+static int nut_write_packet(AVFormatContext *s, AVPacket *pkt){
NUTContext *nut = s->priv_data;
StreamContext *nus= &nut->stream[pkt->stream_index];
AVIOContext *bc = s->pb, *dyn_bc;
NULL);
nut->last_syncpoint_pos= avio_tell(bc);
- ret = url_open_dyn_buf(&dyn_bc);
+ ret = avio_open_dyn_buf(&dyn_bc);
if(ret < 0)
return ret;
put_tt(nut, nus->time_base, dyn_bc, pkt->dts);
if(flags & FLAG_SIZE_MSB) ff_put_v(bc, pkt->size / fc->size_mul);
if(flags & FLAG_HEADER_IDX) ff_put_v(bc, header_idx= best_header_idx);
- if(flags & FLAG_CHECKSUM) avio_wl32(bc, get_checksum(bc));
- else get_checksum(bc);
+ if(flags & FLAG_CHECKSUM) avio_wl32(bc, ffio_get_checksum(bc));
+ else ffio_get_checksum(bc);
avio_write(bc, pkt->data + nut->header_len[header_idx], pkt->size - nut->header_len[header_idx]);
nus->last_flags= flags;
return 0;
}
-static int write_trailer(AVFormatContext *s){
+static int nut_write_trailer(AVFormatContext *s){
NUTContext *nut= s->priv_data;
AVIOContext *bc= s->pb;
}
AVOutputFormat ff_nut_muxer = {
- "nut",
- NULL_IF_CONFIG_SMALL("NUT format"),
- "video/x-nut",
- "nut",
- sizeof(NUTContext),
+ .name = "nut",
+ .long_name = NULL_IF_CONFIG_SMALL("NUT format"),
+ .mime_type = "video/x-nut",
+ .extensions = "nut",
+ .priv_data_size = sizeof(NUTContext),
#if CONFIG_LIBVORBIS
- CODEC_ID_VORBIS,
+ .audio_codec = CODEC_ID_VORBIS,
#elif CONFIG_LIBMP3LAME
- CODEC_ID_MP3,
+ .audio_codec = CODEC_ID_MP3,
#else
- CODEC_ID_MP2,
+ .audio_codec = CODEC_ID_MP2,
#endif
- CODEC_ID_MPEG4,
- write_header,
- write_packet,
- write_trailer,
+ .video_codec = CODEC_ID_MPEG4,
+ .write_header = nut_write_header,
+ .write_packet = nut_write_packet,
+ .write_trailer = nut_write_trailer,
.flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
.codec_tag = (const AVCodecTag * const []){ ff_codec_bmp_tags, ff_nut_video_tags, ff_codec_wav_tags, ff_nut_subtitle_tags, 0 },
};