typedef struct FLVContext {
int reserved;
- offset_t duration_offset;
- offset_t filesize_offset;
+ int64_t duration_offset;
+ int64_t filesize_offset;
int64_t duration;
int delay; ///< first dts delay for AVC
} FLVContext;
static int get_audio_flags(AVCodecContext *enc){
- int flags = (enc->bits_per_sample == 16) ? FLV_SAMPLESSIZE_16BIT : FLV_SAMPLESSIZE_8BIT;
+ int flags = (enc->bits_per_coded_sample == 16) ? FLV_SAMPLESSIZE_16BIT : FLV_SAMPLESSIZE_8BIT;
if (enc->codec_id == CODEC_ID_AAC) // specs force these parameters
return FLV_CODECID_AAC | FLV_SAMPLERATE_44100HZ | FLV_SAMPLESSIZE_16BIT | FLV_STEREO;
flags |= FLV_CODECID_ADPCM | FLV_SAMPLESSIZE_16BIT;
break;
case CODEC_ID_NELLYMOSER:
- flags |= FLV_CODECID_NELLYMOSER | FLV_SAMPLESSIZE_16BIT;
+ if (enc->sample_rate == 8000) {
+ flags |= FLV_CODECID_NELLYMOSER_8KHZ_MONO | FLV_SAMPLESSIZE_16BIT;
+ } else {
+ flags |= FLV_CODECID_NELLYMOSER | FLV_SAMPLESSIZE_16BIT;
+ }
break;
case 0:
flags |= enc->codec_tag<<4;
for (i = 0; i < s->nb_streams; i++) {
AVCodecContext *enc = s->streams[i]->codec;
if (enc->codec_id == CODEC_ID_AAC || enc->codec_id == CODEC_ID_H264) {
- offset_t pos;
+ int64_t pos;
put_byte(pb, enc->codec_type == CODEC_TYPE_VIDEO ?
FLV_TAG_TYPE_VIDEO : FLV_TAG_TYPE_AUDIO);
put_be24(pb, 0); // size patched later
ts = pkt->dts + flv->delay; // add delay to force positive dts
put_be24(pb,size + flags_size);
put_be24(pb,ts);
- put_byte(pb,ts >> 24);
+ put_byte(pb,(ts >> 24) & 0x7F); // timestamps are 32bits _signed_
put_be24(pb,flv->reserved);
put_byte(pb,flags);
if (enc->codec_id == CODEC_ID_VP6)