67 struct MemData *membuf = (
struct MemData*)opaque;
68 int rem = membuf->length - membuf->pos;
73 memcpy(buf, &membuf->buffer[membuf->pos], rem);
81 struct MemData *membuf = (
struct MemData*)opaque;
82 int rem = membuf->length - membuf->pos;
87 memcpy(&membuf->buffer[membuf->pos], buf, rem);
95 struct MemData *membuf = (
struct MemData*)opaque;
97 whence &= ~AVSEEK_FORCE;
101 if(offset < 0 || (
uint64_t)offset > membuf->length)
107 if((offset >= 0 && (
uint64_t)offset > membuf->length-membuf->pos) ||
108 (offset < 0 && (
uint64_t)(-offset) > membuf->pos))
116 membuf->pos = membuf->length +
offset;
120 return membuf->length;
132 struct PacketList *next;
136 AVCodecContext *CodecCtx;
139 struct PacketList *Packets;
144 size_t FrameDataSize;
150 AVFormatContext *FmtCtx;
155 struct MemData membuf;
168 av_log_set_level(AV_LOG_ERROR);
172 if(file && avformat_open_input(&file->FmtCtx, fname,
NULL,
NULL) == 0)
176 if(avformat_find_stream_info(file->FmtCtx,
NULL) >= 0)
178 avformat_close_input(&file->FmtCtx);
190 av_log_set_level(AV_LOG_ERROR);
197 if(file && (file->FmtCtx=avformat_alloc_context()) !=
NULL)
199 file->membuf.buffer =
buffer;
200 file->membuf.length = buffer_len;
201 file->membuf.pos = 0;
203 file->FmtCtx->pb = avio_alloc_context(
NULL, 0, 0, &file->membuf,
206 if(file->FmtCtx->pb && avformat_open_input(&file->FmtCtx, name,
NULL,
NULL) == 0)
208 if(avformat_find_stream_info(file->FmtCtx,
NULL) >= 0)
210 avformat_close_input(&file->FmtCtx);
213 avformat_free_context(file->FmtCtx);
222 int (*read_packet)(
void *user_data,
uint8_t *
buf,
int buf_size),
223 int (*write_packet)(
void *user_data,
uint8_t *buf,
int buf_size),
229 av_log_set_level(AV_LOG_ERROR);
236 if(file && (file->FmtCtx=avformat_alloc_context()) !=
NULL)
238 file->FmtCtx->pb = avio_alloc_context(
NULL, 0, 0, user_data,
239 read_packet, write_packet, seek);
240 if(file->FmtCtx->pb && avformat_open_input(&file->FmtCtx, name,
NULL,
NULL) == 0)
242 if(avformat_find_stream_info(file->FmtCtx,
NULL) >= 0)
244 avformat_close_input(&file->FmtCtx);
247 avformat_free_context(file->FmtCtx);
258 while(stream->Packets)
260 struct PacketList *
self;
262 self = stream->Packets;
263 stream->Packets =
self->next;
265 av_free_packet(&self->pkt);
277 for(i = 0;i < file->StreamsSize;i++)
281 while(stream->Packets)
283 struct PacketList *
self;
285 self = stream->Packets;
286 stream->Packets =
self->next;
288 av_free_packet(&self->pkt);
292 avcodec_close(stream->CodecCtx);
293 av_free(stream->Frame);
298 avformat_close_input(&file->FmtCtx);
309 for(i = 0;i < file->FmtCtx->nb_streams;i++)
311 if(file->FmtCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
314 *numaudiostreams = audiocount;
321 if(!file)
return NULL;
322 for(i = 0;i < file->FmtCtx->nb_streams;i++)
324 if(file->FmtCtx->streams[i]->codec->codec_type != AVMEDIA_TYPE_AUDIO)
336 for(j = 0;j < file->StreamsSize;j++)
338 if(file->Streams[j]->StreamIdx == (
int)i)
339 return file->Streams[
j];
345 if(!stream)
return NULL;
347 stream->parent =
file;
348 stream->CodecCtx = file->FmtCtx->streams[
i]->codec;
349 stream->StreamIdx =
i;
352 codec = avcodec_find_decoder(stream->CodecCtx->codec_id);
353 if(!codec || avcodec_open2(stream->CodecCtx, codec,
NULL) < 0)
361 stream->Frame = avcodec_alloc_frame();
364 avcodec_close(stream->CodecCtx);
368 stream->FrameData =
NULL;
369 stream->FrameDataSize = 0;
374 temp =
realloc(file->Streams, (file->StreamsSize+1) *
375 sizeof(*file->Streams));
378 avcodec_close(stream->CodecCtx);
379 av_free(stream->Frame);
384 file->Streams[file->StreamsSize++] =
stream;
394 if(!stream || stream->CodecCtx->codec_type != AVMEDIA_TYPE_AUDIO)
398 if(stream->CodecCtx->sample_fmt == AV_SAMPLE_FMT_U8)
400 else if(stream->CodecCtx->sample_fmt == AV_SAMPLE_FMT_S16)
402 else if(stream->CodecCtx->sample_fmt == AV_SAMPLE_FMT_S32)
404 else if(stream->CodecCtx->sample_fmt == AV_SAMPLE_FMT_FLT)
406 else if(stream->CodecCtx->sample_fmt == AV_SAMPLE_FMT_DBL)
410 fprintf(stderr,
"Unsupported ffmpeg sample format: %s\n",
411 av_get_sample_fmt_name(stream->CodecCtx->sample_fmt));
418 if(stream->CodecCtx->channel_layout == AV_CH_LAYOUT_MONO)
420 else if(stream->CodecCtx->channel_layout == AV_CH_LAYOUT_STEREO)
422 else if(stream->CodecCtx->channel_layout == AV_CH_LAYOUT_QUAD)
424 else if(stream->CodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK)
426 else if(stream->CodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1)
428 else if(stream->CodecCtx->channel_layout == 0)
431 if(stream->CodecCtx->channels == 1)
433 else if(stream->CodecCtx->channels == 2)
437 fprintf(stderr,
"Unsupported ffmpeg raw channel count: %d\n",
438 stream->CodecCtx->channels);
445 av_get_channel_layout_string(str,
sizeof(str), stream->CodecCtx->channels,
446 stream->CodecCtx->channel_layout);
447 fprintf(stderr,
"Unsupported ffmpeg channel layout: %s\n", str);
451 *rate = stream->CodecCtx->sample_rate;
462 struct PacketList *packet;
464 packet = (
struct PacketList*)av_malloc(
sizeof(*packet));
468 while(av_read_frame(file->FmtCtx, &packet->pkt) >= 0)
471 StreamPtr *iter_end = iter + file->StreamsSize;
475 while(iter != iter_end)
477 if((*iter)->StreamIdx == packet->pkt.stream_index)
479 struct PacketList **last;
481 last = &(*iter)->Packets;
483 last = &(*last)->next;
486 if((*iter)->StreamIdx == streamidx)
489 packet = (
struct PacketList*)av_malloc(
sizeof(*packet));
496 av_free_packet(&packet->pkt);
508 if(length) *length = 0;
510 if(!stream || stream->CodecCtx->codec_type != AVMEDIA_TYPE_AUDIO)
514 if(!stream->Packets && !
getNextPacket(stream->parent, stream->StreamIdx))
518 avcodec_get_frame_defaults(stream->Frame);
519 while((len=avcodec_decode_audio4(stream->CodecCtx, stream->Frame,
520 &got_frame, &stream->Packets->pkt)) < 0)
522 struct PacketList *
self;
525 self = stream->Packets;
526 stream->Packets =
self->next;
528 av_free_packet(&self->pkt);
538 int remaining = stream->Packets->pkt.size -
len;
539 memmove(stream->Packets->pkt.data, &stream->Packets->pkt.data[len],
541 memset(&stream->Packets->pkt.data[remaining], 0,
542 stream->Packets->pkt.size - remaining);
543 stream->Packets->pkt.size -=
len;
547 struct PacketList *
self;
549 self = stream->Packets;
550 stream->Packets =
self->next;
552 av_free_packet(&self->pkt);
556 if(!got_frame || stream->Frame->nb_samples == 0)
560 *length = av_samples_get_buffer_size(
NULL, stream->CodecCtx->channels,
561 stream->Frame->nb_samples,
562 stream->CodecCtx->sample_fmt, 1);
564 return stream->Frame->data[0];
571 if(!stream || stream->CodecCtx->codec_type != AVMEDIA_TYPE_AUDIO)
577 if(stream->FrameDataSize == 0)
579 stream->FrameData =
getAVAudioData(stream, &stream->FrameDataSize);
580 if(!stream->FrameData)
584 if(stream->FrameDataSize > 0)
588 size_t rem = length-dec;
589 if(rem > stream->FrameDataSize)
590 rem = stream->FrameDataSize;
595 memcpy(data, stream->FrameData, rem);
596 data = (
char*)data + rem;
602 stream->FrameData += rem;
603 stream->FrameDataSize -= rem;
619 if(!stream || stream->CodecCtx->codec_type != AVMEDIA_TYPE_AUDIO)
631 memcpy(&outbuf[buflen], inbuf, got);
634 outbuf = (
char*)
realloc(outbuf, buflen);
static int getNextPacket(FilePtr file, int streamidx)
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
FilePtr openAVFile(const char *fname)
void * decodeAVAudioStream(StreamPtr stream, size_t *length)
unsigned long long uint64_t
FilePtr openAVData(const char *name, char *buffer, size_t buffer_len)
EGLImageKHR EGLint * name
static int MemData_read(void *opaque, uint8_t *buf, int buf_size)
FilePtr openAVCustom(const char *name, void *user_data, int(*read_packet)(void *user_data, uint8_t *buf, int buf_size), int(*write_packet)(void *user_data, uint8_t *buf, int buf_size), int64_t(*seek)(void *user_data, int64_t offset, int whence))
size_t readAVAudioData(StreamPtr stream, void *data, size_t length)
StreamPtr getAVAudioStream(FilePtr file, int streamnum)
EGLContext EGLenum EGLClientBuffer buffer
#define AL_UNSIGNED_BYTE_SOFT
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
struct MyStream * StreamPtr
void clearAVAudioData(StreamPtr stream)
EGLSurface EGLint void ** value
int getAVFileInfo(FilePtr file, int *numaudiostreams)
static int64_t MemData_seek(void *opaque, int64_t offset, int whence)
GLenum GLuint GLsizei const GLchar * buf
uint8_t * getAVAudioData(StreamPtr stream, size_t *length)
static size_t NextPowerOf2(size_t value)
void closeAVFile(FilePtr file)
static int MemData_write(void *opaque, uint8_t *buf, int buf_size)
int getAVAudioInfo(StreamPtr stream, ALuint *rate, ALenum *channels, ALenum *type)