mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-24 18:41:57 +00:00
* depends on libmp4v2 <http://code.google.com/p/mp4v2/> (originally compiled against v1.6.1) * File format details: - Files must be hinted (mpeg4ip can be used to create the hint tracks). - Video track encoding must be supported by FS (e.g. H.263) - Audio track encoding must be PCMU/8000/Mono. The audio track can be created with this tool: <https://asteriskvideo.svn.sourceforge.net/svnroot/asteriskvideo/tools/pcm2mp4.cpp>
138 lines
3.0 KiB
C++
138 lines
3.0 KiB
C++
/*
|
|
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in
|
|
compliance with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/
|
|
|
|
Software distributed under the License is distributed on an "AS IS"
|
|
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
License for the specific language governing rights and limitations
|
|
under the License.
|
|
|
|
The Original Code is MP4 Helper Library to Freeswitch MP4 module.
|
|
|
|
The Initial Developer of the Original Code is
|
|
Paulo Rogério Panhoto <paulo@voicetechnology.com.br>.
|
|
Portions created by the Initial Developer are Copyright (C)
|
|
the Initial Developer. All Rights Reserved.
|
|
|
|
*/
|
|
|
|
#ifndef MP4_HELPER_HPP_
|
|
#define MP4_HELPER_HPP_
|
|
|
|
#include <mp4.h>
|
|
#include <string>
|
|
#include <exception>
|
|
#include <string>
|
|
|
|
namespace MP4
|
|
{
|
|
class Exception: public std::exception {
|
|
public:
|
|
Exception(const std::string & file, const std::string & error)
|
|
: description_(file + ':' + error)
|
|
{
|
|
}
|
|
|
|
const char * what() const throw()
|
|
{
|
|
return description_.c_str();
|
|
}
|
|
|
|
~Exception() throw()
|
|
{
|
|
}
|
|
|
|
private:
|
|
std::string description_;
|
|
};
|
|
|
|
struct RuntimeProperties {
|
|
u_int32_t frame; // sampleID
|
|
u_int16_t packetsPerFrame;
|
|
u_int16_t packet; // packetID
|
|
u_int32_t last_frame; // timestamp
|
|
|
|
RuntimeProperties(): frame(0), packetsPerFrame(0), packet(0)
|
|
{
|
|
}
|
|
};
|
|
|
|
|
|
struct TrackProperties {
|
|
MP4TrackId hint;
|
|
MP4TrackId track;
|
|
|
|
char * codecName;
|
|
u_int8_t payload;
|
|
u_int32_t clock;
|
|
u_int32_t packetLength; // packet Length in time (ms)
|
|
|
|
RuntimeProperties runtime;
|
|
|
|
TrackProperties(): hint(MP4_INVALID_TRACK_ID), track(MP4_INVALID_TRACK_ID),
|
|
codecName(NULL), payload(0), clock(0), packetLength(0)
|
|
{
|
|
}
|
|
};
|
|
|
|
typedef TrackProperties AudioProperties;
|
|
|
|
struct VideoProperties {
|
|
TrackProperties track;
|
|
std::string fmtp;
|
|
|
|
VideoProperties()
|
|
{
|
|
}
|
|
|
|
VideoProperties(const TrackProperties & rhs): track(rhs)
|
|
{
|
|
}
|
|
};
|
|
|
|
class Context {
|
|
public:
|
|
|
|
Context(const char * file, bool create = false);
|
|
~Context();
|
|
|
|
void open(const char * file);
|
|
|
|
void create(const char * file);
|
|
|
|
void close();
|
|
|
|
// returns: TRUE = has more data, FALSE = end-of-stream or failure
|
|
bool getVideoPacket(void * buffer, u_int & size, u_int & ts);
|
|
|
|
// returns: TRUE = has more data, FALSE = end-of-stream or failure
|
|
bool getAudioPacket(void * buffer, u_int & size, u_int & ts);
|
|
|
|
bool isOpen() const { return fh != MP4_INVALID_FILE_HANDLE; }
|
|
|
|
bool isSupported() const { return audio.track != MP4_INVALID_TRACK_ID && video.track.track != MP4_INVALID_TRACK_ID; }
|
|
|
|
const AudioProperties & audioTrack() const { return audio; }
|
|
|
|
const VideoProperties & videoTrack() const { return video; }
|
|
|
|
private:
|
|
MP4FileHandle fh;
|
|
AudioProperties audio;
|
|
|
|
VideoProperties video;
|
|
|
|
// Prevent copy construction.
|
|
Context(const Context &);
|
|
|
|
bool getPacket(MP4TrackId hint, RuntimeProperties & rt,
|
|
bool header, void * buffer, u_int & size, u_int & ts);
|
|
|
|
void getTracks(const char * file);
|
|
};
|
|
}
|
|
#endif
|