World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Класс AudioBaseDataSource
+ Граф наследования:AudioBaseDataSource:
+ Граф связей класса AudioBaseDataSource:

Открытые члены

 AudioBaseDataSource ()
 
virtual ~AudioBaseDataSource ()
 
virtual bool Open ()
 
virtual void Close ()
 
virtual size_t GetSampleRate ()
 
virtual size_t GetChannelCount ()
 
virtual PMemBuffer GetNextBuffer ()
 
- Открытые члены унаследованные от IAudioDataSource
 IAudioDataSource ()
 
virtual ~IAudioDataSource ()
 

Защищенные данные

AVFormatContextpFormatContext
 
int iStreamIndex
 
AVCodecContextpCodecContext
 
SwrContextpConverter
 
bool bOpened
 
std::queue< PMemBuffer, std::deque< PMemBuffer > > queue
 

Подробное описание

См. определение в файле MediaPlayer.cpp строка 884

Конструктор(ы)

◆ AudioBaseDataSource()

AudioBaseDataSource::AudioBaseDataSource ( )

См. определение в файле MediaPlayer.cpp строка 905

905  {
906  pFormatContext = nullptr;
907  iStreamIndex = -1;
908  pCodecContext = nullptr;
909  pConverter = nullptr;
910  bOpened = false;
911 }

Перекрестные ссылки bOpened, iStreamIndex, pCodecContext, pConverter и pFormatContext.

◆ ~AudioBaseDataSource()

virtual AudioBaseDataSource::~AudioBaseDataSource ( )
inlinevirtual

См. определение в файле MediaPlayer.cpp строка 887

887 { Close(); }

Перекрестные ссылки Close().

+ Граф вызовов:

Методы

◆ Open()

bool AudioBaseDataSource::Open ( )
virtual

Замещает IAudioDataSource.

Переопределяется в AudioBufferDataSource и AudioFileDataSource.

См. определение в файле MediaPlayer.cpp строка 913

913  {
914  // Retrieve stream information
915  if (avformat_find_stream_info(pFormatContext, nullptr) < 0) {
916  Close();
917  fprintf(stderr, "ffmpeg: Unable to find stream info\n");
918  return false;
919  }
920 
921  AVCodec *codec = nullptr;
923  -1, &codec, 0);
924  if (iStreamIndex < 0) {
925  Close();
926  fprintf(stderr, "ffmpeg: Unable to find audio stream\n");
927  return false;
928  }
929 
932  if (pCodecContext == nullptr) {
933  Close();
934  return false;
935  }
936 
937  if (avcodec_parameters_to_context(pCodecContext, stream->codecpar) < 0) {
938  Close();
939  return false;
940  }
941  if (avcodec_open2(pCodecContext, codec, nullptr) < 0) {
942  Close();
943  return false;
944  }
945 
947  pConverter,
949  : AV_CH_LAYOUT_MONO,
952  : AV_CH_LAYOUT_MONO,
954  if (swr_init(pConverter) < 0) {
955  Close();
956  fprintf(stderr, "ffmpeg: Failed to create converter\n");
957  return false;
958  }
959 
960  bOpened = true;
961 
962  return true;
963 }

Перекрестные ссылки av_find_best_stream(), AV_SAMPLE_FMT_S16, avcodec_alloc_context3(), avcodec_open2(), avcodec_parameters_to_context(), avformat_find_stream_info(), AVMEDIA_TYPE_AUDIO, bOpened, AVCodecContext::channel_layout, Close(), iStreamIndex, pCodecContext, pConverter, pFormatContext, AVCodecContext::sample_fmt, AVCodecContext::sample_rate, AVFormatContext::streams, swr_alloc_set_opts() и swr_init().

Используется в AudioFileDataSource::Open() и AudioBufferDataSource::Open().

+ Граф вызовов:
+ Граф вызова функции:

◆ Close()

void AudioBaseDataSource::Close ( )
virtual

Замещает IAudioDataSource.

См. определение в файле MediaPlayer.cpp строка 965

965  {
966  if (pConverter != nullptr) {
968  pConverter = nullptr;
969  }
970 
971  if (pCodecContext) {
973  pCodecContext = nullptr;
974  }
975 
976  iStreamIndex = -1;
977 
978  if (pFormatContext != nullptr) {
980  pFormatContext = nullptr;
981  }
982 }

Перекрестные ссылки avcodec_close(), avformat_close_input(), iStreamIndex, pCodecContext, pConverter, pFormatContext и swr_free().

Используется в Open(), AudioBufferDataSource::Open() и ~AudioBaseDataSource().

+ Граф вызовов:
+ Граф вызова функции:

◆ GetSampleRate()

size_t AudioBaseDataSource::GetSampleRate ( )
virtual

Замещает IAudioDataSource.

См. определение в файле MediaPlayer.cpp строка 984

984  {
985  if (pCodecContext == nullptr) {
986  return 0;
987  }
988 
989  return pCodecContext->sample_rate;
990 }

Перекрестные ссылки pCodecContext и AVCodecContext::sample_rate.

◆ GetChannelCount()

size_t AudioBaseDataSource::GetChannelCount ( )
virtual

Замещает IAudioDataSource.

См. определение в файле MediaPlayer.cpp строка 992

992  {
993  if (pCodecContext == nullptr) {
994  return 0;
995  }
996 
997  return pCodecContext->channels;
998 }

Перекрестные ссылки AVCodecContext::channels и pCodecContext.

◆ GetNextBuffer()

PMemBuffer AudioBaseDataSource::GetNextBuffer ( )
virtual

Замещает IAudioDataSource.

См. определение в файле MediaPlayer.cpp строка 1000

1000  {
1002 
1003  if (!queue.empty()) {
1004  buffer = queue.front();
1005  queue.pop();
1006  }
1007 
1008  AVPacket *packet = av_packet_alloc();
1009 
1010  if (av_read_frame(pFormatContext, packet) >= 0) {
1011  if (avcodec_send_packet(pCodecContext, packet) >= 0) {
1013  AVFrame *frame = av_frame_alloc();
1014  int res = 0;
1015  while (res >= 0) {
1017  if (res == AVERROR(EAGAIN) || res == AVERROR_EOF) {
1018  break;
1019  }
1020  if (res < 0) {
1021  return buffer;
1022  }
1023  PMemBuffer tmp_buf = AllocMemBuffer(
1024  frame->nb_samples * pCodecContext->channels * 2);
1025  uint8_t *dst_channels[8] = {0};
1026  dst_channels[0] = (uint8_t *)tmp_buf->GetData();
1027  int got_samples = swr_convert(
1028  pConverter, dst_channels, frame->nb_samples,
1029  (const uint8_t **)frame->data, frame->nb_samples);
1030  if (got_samples > 0) {
1031  if (!buffer) {
1032  buffer = tmp_buf;
1033  } else {
1034  queue.push(tmp_buf);
1035  }
1036  }
1037  }
1038  av_frame_free(&frame);
1039  }
1040  }
1041 
1042  av_packet_free(&packet);
1043 
1044  return buffer;
1045 }

Перекрестные ссылки AllocMemBuffer(), av_frame_alloc(), av_frame_free(), av_packet_alloc(), av_packet_free(), av_read_frame(), avcodec_receive_frame(), avcodec_send_packet(), AVCodecContext::channels, AVFrame::data, AVFrame::nb_samples, pCodecContext, pConverter, pFormatContext, queue и swr_convert().

+ Граф вызовов:

Данные класса

◆ pFormatContext

AVFormatContext* AudioBaseDataSource::pFormatContext
protected

См. определение в файле MediaPlayer.cpp строка 897

Используется в AudioBaseDataSource(), Close(), GetNextBuffer(), Open(), AudioFileDataSource::Open() и AudioBufferDataSource::Open().

◆ iStreamIndex

int AudioBaseDataSource::iStreamIndex
protected

См. определение в файле MediaPlayer.cpp строка 898

Используется в AudioBaseDataSource(), Close() и Open().

◆ pCodecContext

AVCodecContext* AudioBaseDataSource::pCodecContext
protected

См. определение в файле MediaPlayer.cpp строка 899

Используется в AudioBaseDataSource(), Close(), GetChannelCount(), GetNextBuffer(), GetSampleRate() и Open().

◆ pConverter

SwrContext* AudioBaseDataSource::pConverter
protected

См. определение в файле MediaPlayer.cpp строка 900

Используется в AudioBaseDataSource(), Close(), GetNextBuffer() и Open().

◆ bOpened

bool AudioBaseDataSource::bOpened
protected

См. определение в файле MediaPlayer.cpp строка 901

Используется в AudioBaseDataSource(), Open(), AudioFileDataSource::Open() и AudioBufferDataSource::Open().

◆ queue

std::queue<PMemBuffer, std::deque<PMemBuffer> > AudioBaseDataSource::queue
protected

См. определение в файле MediaPlayer.cpp строка 902

Используется в GetNextBuffer().


Объявления и описания членов класса находятся в файле:
avcodec_close
int avcodec_close(AVCodecContext *avctx)
av_frame_free
void av_frame_free(AVFrame **frame)
AudioBaseDataSource::iStreamIndex
int iStreamIndex
Definition: MediaPlayer.cpp:898
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
av_packet_free
void av_packet_free(AVPacket **pkt)
avformat_close_input
void avformat_close_input(AVFormatContext **s)
av_frame_alloc
AVFrame * av_frame_alloc(void)
result
GLuint64EXT * result
Definition: SDL_opengl_glext.h:9435
swr_init
int swr_init(struct SwrContext *s)
avcodec_alloc_context3
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
buffer
EGLContext EGLenum EGLClientBuffer buffer
Definition: SDL_egl.h:952
avcodec_receive_frame
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
AllocMemBuffer
PMemBuffer AllocMemBuffer(size_t size)
Definition: MemBuffer.cpp:20
AudioBaseDataSource::bOpened
bool bOpened
Definition: MediaPlayer.cpp:901
swr_alloc_set_opts
struct SwrContext * swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)
avcodec_open2
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
AudioBaseDataSource::pFormatContext
AVFormatContext * pFormatContext
Definition: MediaPlayer.cpp:897
avformat_find_stream_info
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
swr_free
void swr_free(struct SwrContext **s)
swr_convert
int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in, int in_count)
av_packet_alloc
AVPacket * av_packet_alloc(void)
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
sample format
Definition: avcodec.h:2233
stream
EGLStreamKHR stream
Definition: SDL_egl.h:1082
avcodec_send_packet
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
AVFormatContext::streams
AVStream ** streams
Definition: avformat.h:1412
AudioBaseDataSource::pConverter
SwrContext * pConverter
Definition: MediaPlayer.cpp:900
avcodec_parameters_to_context
int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par)
AVFrame::nb_samples
int nb_samples
Definition: frame.h:361
uint8_t
unsigned __int8 uint8_t
Definition: SDL_config.h:35
AV_SAMPLE_FMT_S16
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition: samplefmt.h:61
AudioBaseDataSource::queue
std::queue< PMemBuffer, std::deque< PMemBuffer > > queue
Definition: MediaPlayer.cpp:902
AVPacket
Definition: avcodec.h:1454
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
Definition: frame.h:309
AudioBaseDataSource::Close
virtual void Close()
Definition: MediaPlayer.cpp:965
AVStream
Definition: avformat.h:872
AVCodec
Definition: avcodec.h:3481
res
GLuint res
Definition: SDL_opengl_glext.h:7940
PMemBuffer
std::shared_ptr< IMemBuffer > PMemBuffer
Definition: MemBuffer.h:13
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2226
AudioBaseDataSource::pCodecContext
AVCodecContext * pCodecContext
Definition: MediaPlayer.cpp:899
AVFrame
Definition: frame.h:295
AVCodecContext::channel_layout
uint64_t channel_layout
Definition: avcodec.h:2276
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:2225
av_find_best_stream
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, AVCodec **decoder_ret, int flags)