view liboggplayer-src/src/imp.hpp @ 14:083c73ceb716

Get rid of the vorbis related code.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 05 Aug 2013 16:54:46 +0300
parents 105513a2e3c9
children 74b28a572438
line wrap: on
line source

#include <oggplayer.h>
#ifdef VORBIS_SUPPORT
#include "SDL_audiocvt.hpp"
#endif
#include <fstream>
#include <vector>
#include <theora/theora.h>
#include <vorbis/codec.h>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/condition.hpp>
#include <boost/circular_buffer.hpp>
#include <boost/timer.hpp>

struct OggPlayer::Imp {

	Imp() :
		cirbuf(0),video_lock(video_mut, boost::defer_lock){
		failbit = false;
		playing = false;
		need_close = false;
		time_factor = 1;
		refs = 1;
	}

	~Imp() {
		// open() tears down the partial setup on fail
		if (!failbit)
			close();
	}
	int queue_page(ogg_page * page);
	bool buffer_data();
	double get_time();
	void close();
	bool init_decoders();
	bool parse_headers();
	void open(std::string path, AudioFormat audio_format, int channels,
			int rate, VideoFormat video_format);
	bool decode_audio();
	bool decode_video();
	bool ready();
	void play();
	void play_loop();

	bool failbit;
	std::ifstream file_in;

	int theora_p;
	int vorbis_p;

	ogg_sync_state o_sync;

	vorbis_comment v_comment;
	theora_info t_info;
	theora_comment t_comment;
	vorbis_info v_info;

	ogg_page o_page;
	ogg_packet o_packet;

	ogg_stream_state o_tsstate;
	ogg_stream_state o_vsstate;

	theora_state t_state;
	vorbis_dsp_state v_state;
	vorbis_block v_block;

	int pp_level_max;
	int pp_level;
	int pp_inc;

	char* audio_buffer;
	boost::circular_buffer<char> cirbuf;
	unsigned int audio_buffer_size;
#ifdef VORBIS_SUPPORT
	SDL_AudioCVT cvt;
#endif

	bool playing;

	boost::thread play_thread;
	boost::mutex audio_mut;
	boost::mutex video_mut;
	boost::condition_variable audio_ready_cond;
	boost::condition_variable video_ready_cond;

	bool videobuf_ready;
	double videobuf_time;

	bool audio_cache_ready;

	// This lock should only be used from the main thread
	boost::unique_lock<boost::mutex> video_lock;
	// These variables are used to identify the frames (not just count them, not a debug variable)
	// see video_buffer_try_lock and video_read
	int frame;
	int last_frame_read;

	int audio_bytes_played;
	struct AudioGranulePos {
		int pos;
		double set_time;
	};
	std::deque<AudioGranulePos> audio_granule_poses;
	double time_factor;

	struct PixelFormat{
		void set(int r,int g,int b,int bpp){
			r_offset = r;
			g_offset = g;
			b_offset = b;
			this->bpp =bpp;
		}
		int r_offset;
		int g_offset;
		int b_offset;
		// if bpp=4 we have an alpha channel at offset 4
		int bpp;

	} pixel_format;
	bool need_close;
	boost::timer timer;
	int refs;
};