//
// file_source.h
// ~~~~~~~~~~~~~
//
// Copyright (c) 2011 Jack (jack.wgm@gmail.com)
//

#ifndef __FILE_SOURCE_H__
#define __FILE_SOURCE_H__

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

#include <string>

#include "av_source.h"

struct open_file_data
{
   // 鏄惁鏄绾跨▼璁块棶, 濡傛灉鍗曠嚎绋嬭闂?   // , 鍒欏唴閮ㄨ嚜鍔ㄤ娇鐢ㄦ棤閿佽璁?
   bool is_multithread;

   // 鎵撳紑鏂囦欢鍚?
   std::string filename;
};

class file_source
   : public av_source
{
public:
   file_source();
   virtual ~file_source();

public:
   // 鎵撳紑.
   virtual bool open(void* ctx);

   // 璇诲彇鏁版嵁.
   virtual bool read_data(char* data, uint64_t offset, size_t size, size_t& read_size);

   // 鍏抽棴.
   virtual void close();

private:
   // 鏂囦欢鎵撳紑缁撴瀯.
   open_file_data *m_open_data;

   // 鏂囦欢鎸囬拡.
   FILE* m_file;

   // 鏂囦欢澶у皬.
   uint64_t m_file_size;

   // 绾跨▼瀹夊叏閿?
   mutable pthread_mutex_t m_mutex;
};

#endif // __FILE_SOURCE_H__