Commit 9358bbf1 authored by Stefan Westerfeld's avatar Stefan Westerfeld

HLSOutputStream: auto close stream in destructor if necessary

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent ff5f8c27
...@@ -53,6 +53,11 @@ HLSOutputStream::HLSOutputStream (int n_channels, int sample_rate, int bit_depth ...@@ -53,6 +53,11 @@ HLSOutputStream::HLSOutputStream (int n_channels, int sample_rate, int bit_depth
{ {
} }
HLSOutputStream::~HLSOutputStream()
{
close();
}
/* Add an output stream. */ /* Add an output stream. */
Error Error
HLSOutputStream::add_stream (AVCodec **codec, enum AVCodecID codec_id) HLSOutputStream::add_stream (AVCodec **codec, enum AVCodecID codec_id)
...@@ -320,6 +325,8 @@ HLSOutputStream::close_stream() ...@@ -320,6 +325,8 @@ HLSOutputStream::close_stream()
Error Error
HLSOutputStream::open (const string& out_filename, size_t cut_aac_frames, size_t keep_aac_frames, double pts_start, size_t delete_input_start) HLSOutputStream::open (const string& out_filename, size_t cut_aac_frames, size_t keep_aac_frames, double pts_start, size_t delete_input_start)
{ {
assert (m_state == State::NEW);
avformat_alloc_output_context2 (&m_fmt_ctx, NULL, "mpegts", NULL); avformat_alloc_output_context2 (&m_fmt_ctx, NULL, "mpegts", NULL);
if (!m_fmt_ctx) if (!m_fmt_ctx)
return Error ("failed to alloc avformat output context"); return Error ("failed to alloc avformat output context");
...@@ -359,12 +366,19 @@ HLSOutputStream::open (const string& out_filename, size_t cut_aac_frames, size_t ...@@ -359,12 +366,19 @@ HLSOutputStream::open (const string& out_filename, size_t cut_aac_frames, size_t
m_start_pos = pts_start * m_sample_rate - cut_aac_frames * 1024; m_start_pos = pts_start * m_sample_rate - cut_aac_frames * 1024;
m_start_pos += 1024; m_start_pos += 1024;
m_state = State::OPEN;
return Error::Code::NONE; return Error::Code::NONE;
} }
Error Error
HLSOutputStream::close() HLSOutputStream::close()
{ {
if (m_state != State::OPEN)
return Error::Code::NONE;
// never close twice
m_state = State::CLOSED;
Error err; Error err;
while (write_audio_frame (err) == 0); while (write_audio_frame (err) == 0);
if (err) if (err)
......
...@@ -89,6 +89,13 @@ class HLSOutputStream : public AudioOutputStream { ...@@ -89,6 +89,13 @@ class HLSOutputStream : public AudioOutputStream {
AudioBuffer m_audio_buffer; AudioBuffer m_audio_buffer;
size_t m_delete_input_start = 0; size_t m_delete_input_start = 0;
enum class State {
NEW,
OPEN,
CLOSED
};
State m_state = State::NEW;
Error add_stream (AVCodec **codec, enum AVCodecID codec_id); Error add_stream (AVCodec **codec, enum AVCodecID codec_id);
Error open_audio (AVCodec *codec, AVDictionary *opt_arg); Error open_audio (AVCodec *codec, AVDictionary *opt_arg);
AVFrame *get_audio_frame(); AVFrame *get_audio_frame();
...@@ -98,6 +105,7 @@ class HLSOutputStream : public AudioOutputStream { ...@@ -98,6 +105,7 @@ class HLSOutputStream : public AudioOutputStream {
int write_frame (const AVRational *time_base, AVStream *st, AVPacket *pkt); int write_frame (const AVRational *time_base, AVStream *st, AVPacket *pkt);
public: public:
HLSOutputStream (int n_channels, int sample_rate, int bit_depth); HLSOutputStream (int n_channels, int sample_rate, int bit_depth);
~HLSOutputStream();
Error open (const std::string& output_filename, size_t cut_aac_frames, size_t keep_aac_frames, double pts_start, size_t delete_input_start); Error open (const std::string& output_filename, size_t cut_aac_frames, size_t keep_aac_frames, double pts_start, size_t delete_input_start);
int bit_depth() const override; int bit_depth() const override;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment