bool AVFormatWriter::WriteAudioFrame(unsigned char *buf, int fnum, int timecode) { #if HAVE_BIGENDIAN int sample_cnt = m_audioFrameSize / m_audioBytesPerSample; bswap_16_buf((short int*) buf, sample_cnt, m_audioChannels); #endif int got_packet = 0; int ret = 0; av_init_packet(m_audPkt); m_audPkt->data = m_audioOutBuf; m_audPkt->size = m_audioOutBufSize; m_audPicture->data[0] = buf; m_audPicture->linesize[0] = m_audioFrameSize; m_audPicture->nb_samples = m_audioFrameSize; m_audPicture->format = AV_SAMPLE_FMT_S16; { QMutexLocker locker(avcodeclock); ret = avcodec_encode_audio2(m_audioStream->codec, m_audPkt, m_audPicture, &got_packet); } if (ret < 0 || !got_packet) { #if 0 LOG(VB_RECORD, LOG_ERR, QString("WriteAudioFrame(): No Encoded Data: cs: %1, mfw: %2, tc: %3, fn: %4").arg(m_audPkt->size).arg(m_framesWritten).arg(timecode).arg(fnum)); #endif return false; } long long tc = timecode; if (m_startingTimecodeOffset == -1) m_startingTimecodeOffset = tc; tc -= m_startingTimecodeOffset; if (m_avVideoCodec) m_audPkt->pts = tc * m_videoStream->time_base.den / m_videoStream->time_base.num / 1000; else m_audPkt->pts = tc * m_audioStream->time_base.den / m_audioStream->time_base.num / 1000; m_audPkt->dts = AV_NOPTS_VALUE; m_audPkt->flags |= AV_PKT_FLAG_KEY; m_audPkt->data = (uint8_t*)m_audioOutBuf; m_audPkt->stream_index = m_audioStream->index; // LOG(VB_RECORD, LOG_ERR, QString("WriteAudioFrame(): cs: %1, mfw: %2, pkt->pts: %3, tc: %4, fn: %5").arg(m_audPkt->size).arg(m_framesWritten).arg(m_audPkt->pts).arg(timecode).arg(fnum)); ret = av_interleaved_write_frame(m_ctx, m_audPkt); if (ret != 0) LOG(VB_RECORD, LOG_ERR, LOC + "WriteAudioFrame(): " "av_interleaved_write_frame couldn't write Audio"); return true; }
int AVFormatWriter::WriteAudioFrame(unsigned char *buf, int fnum, long long &timecode) { #if HAVE_BIGENDIAN bswap_16_buf((short int*) buf, m_audioFrameSize, m_audioChannels); #endif int got_packet = 0; int ret = 0; int samples_per_avframe = m_audioFrameSize * m_audioChannels; int sampleSizeIn = AudioOutputSettings::SampleSize(FORMAT_S16); AudioFormat format = AudioOutputSettings::AVSampleFormatToFormat(m_audioStream->codec->sample_fmt); int sampleSizeOut = AudioOutputSettings::SampleSize(format); AVPacket pkt; av_init_packet(&pkt); pkt.data = NULL; pkt.size = 0; if (av_get_packed_sample_fmt(m_audioStream->codec->sample_fmt) == AV_SAMPLE_FMT_FLT) { AudioOutputUtil::toFloat(FORMAT_S16, (void *)m_audioInBuf, (void *)buf, samples_per_avframe * sampleSizeIn); buf = m_audioInBuf; } if (av_sample_fmt_is_planar(m_audioStream->codec->sample_fmt)) { AudioOutputUtil::DeinterleaveSamples(format, m_audioChannels, m_audioInPBuf, buf, samples_per_avframe * sampleSizeOut); // init AVFrame for planar data (input is interleaved) for (int j = 0, jj = 0; j < m_audioChannels; j++, jj += m_audioFrameSize) { m_audPicture->data[j] = (uint8_t*)(m_audioInPBuf + jj * sampleSizeOut); } } else { m_audPicture->data[0] = buf; } m_audPicture->linesize[0] = m_audioFrameSize; m_audPicture->nb_samples = m_audioFrameSize; m_audPicture->format = m_audioStream->codec->sample_fmt; m_audPicture->extended_data = m_audPicture->data; m_bufferedAudioFrameTimes.push_back(timecode); { QMutexLocker locker(avcodeclock); ret = avcodec_encode_audio2(m_audioStream->codec, &pkt, m_audPicture, &got_packet); } if (ret < 0) { LOG(VB_RECORD, LOG_ERR, "avcodec_encode_audio2() failed"); return ret; } if (!got_packet) { //LOG(VB_RECORD, LOG_ERR, QString("WriteAudioFrame(): Frame Buffered: cs: %1, mfw: %2, f->tc: %3, fn: %4").arg(m_audPkt->size).arg(m_framesWritten).arg(timecode).arg(fnum)); return ret; } long long tc = timecode; if (m_bufferedAudioFrameTimes.size()) tc = m_bufferedAudioFrameTimes.takeFirst(); if (m_startingTimecodeOffset == -1) m_startingTimecodeOffset = tc - 1; tc -= m_startingTimecodeOffset; if (m_avVideoCodec) pkt.pts = tc * m_videoStream->time_base.den / m_videoStream->time_base.num / 1000; else pkt.pts = tc * m_audioStream->time_base.den / m_audioStream->time_base.num / 1000; pkt.dts = AV_NOPTS_VALUE; pkt.flags |= AV_PKT_FLAG_KEY; pkt.stream_index = m_audioStream->index; //LOG(VB_RECORD, LOG_ERR, QString("WriteAudioFrame(): cs: %1, mfw: %2, pkt->pts: %3, tc: %4, fn: %5, f->tc: %6").arg(m_audPkt->size).arg(m_framesWritten).arg(m_audPkt->pts).arg(tc).arg(fnum).arg(timecode)); ret = av_interleaved_write_frame(m_ctx, &pkt); if (ret != 0) LOG(VB_RECORD, LOG_ERR, LOC + "WriteAudioFrame(): " "av_interleaved_write_frame couldn't write Audio"); timecode = tc + m_startingTimecodeOffset; av_packet_unref(&pkt); return 1; }
int AVFormatWriter::WriteAudioFrame(unsigned char *buf, int fnum, long long &timecode) { #if HAVE_BIGENDIAN bswap_16_buf((short int*) buf, m_audioFrameSize, m_audioChannels); #endif int got_packet = 0; int ret = 0; av_init_packet(m_audPkt); if (m_audioStream->codec->sample_fmt == AV_SAMPLE_FMT_FLT) { AudioOutputUtil::toFloat(FORMAT_S16, (void *)m_audioFltBuf, (void *)buf, m_audioFrameSize * 2 * m_audioChannels); m_audPicture->data[0] = (unsigned char *)m_audioFltBuf; } else { m_audPicture->data[0] = buf; } m_audPkt->data = m_audioOutBuf; m_audPkt->size = m_audioOutBufSize; m_audPicture->linesize[0] = m_audioFrameSize; m_audPicture->nb_samples = m_audioFrameSize; m_audPicture->format = m_audioStream->codec->sample_fmt; m_audPicture->extended_data = m_audPicture->data; m_bufferedAudioFrameTimes.push_back(timecode); { QMutexLocker locker(avcodeclock); ret = avcodec_encode_audio2(m_audioStream->codec, m_audPkt, m_audPicture, &got_packet); } if (ret < 0) { LOG(VB_RECORD, LOG_ERR, "avcodec_encode_audio2() failed"); return ret; } if (!got_packet) { //LOG(VB_RECORD, LOG_ERR, QString("WriteAudioFrame(): Frame Buffered: cs: %1, mfw: %2, f->tc: %3, fn: %4").arg(m_audPkt->size).arg(m_framesWritten).arg(timecode).arg(fnum)); return ret; } long long tc = timecode; if (m_bufferedAudioFrameTimes.size()) tc = m_bufferedAudioFrameTimes.takeFirst(); if (m_startingTimecodeOffset == -1) m_startingTimecodeOffset = tc - 1; tc -= m_startingTimecodeOffset; if (m_avVideoCodec) m_audPkt->pts = tc * m_videoStream->time_base.den / m_videoStream->time_base.num / 1000; else m_audPkt->pts = tc * m_audioStream->time_base.den / m_audioStream->time_base.num / 1000; m_audPkt->dts = AV_NOPTS_VALUE; m_audPkt->flags |= AV_PKT_FLAG_KEY; m_audPkt->stream_index = m_audioStream->index; //LOG(VB_RECORD, LOG_ERR, QString("WriteAudioFrame(): cs: %1, mfw: %2, pkt->pts: %3, tc: %4, fn: %5, f->tc: %6").arg(m_audPkt->size).arg(m_framesWritten).arg(m_audPkt->pts).arg(tc).arg(fnum).arg(timecode)); ret = av_interleaved_write_frame(m_ctx, m_audPkt); if (ret != 0) LOG(VB_RECORD, LOG_ERR, LOC + "WriteAudioFrame(): " "av_interleaved_write_frame couldn't write Audio"); timecode = tc + m_startingTimecodeOffset; return 1; }