Cog/Plugins/FFMPEG/FFMPEGDecoder.h
Christopher Snowhill 814f65f830 FFMPEG: Optimize file reader access
Improve handling where FFmpeg may call the provided file reader with
AVSEEK_SIZE repeatedly, when file size is not likely to change between
repeated calls. This prevents repeated seek operations that would
otherwise be required to probe the file size each time.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
2025-02-26 21:20:27 -08:00

93 lines
1.6 KiB
Objective-C

//
// FFMPEGDecoder.h
// FFMPEG
//
// Created by Andre Reffhaug on 2/26/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "Plugin.h"
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
@interface FFMPEGReader : NSObject {
id<CogSource> file;
BOOL cachedSize;
int64_t size;
}
- (id)initWithFile:(id<CogSource>)f;
- (id<CogSource>)file;
- (int64_t)size;
@end
extern int ffmpeg_read(void *opaque, uint8_t *buf, int buf_size);
extern int ffmpeg_write(void *opaque, const uint8_t *buf, int buf_size);
int64_t ffmpeg_seek(void *opaque, int64_t offset, int whence);
@interface FFMPEGDecoder : NSObject <CogDecoder> {
id<CogSource> source;
FFMPEGReader *reader;
BOOL seekable;
int channels;
uint32_t channelConfig;
int bitsPerSample;
BOOL floatingPoint;
BOOL lossy;
float frequency;
long totalFrames;
long framesRead;
int bitrate;
int subsong;
int64_t startTime;
int64_t endTime;
BOOL seekedToStart;
@private
unsigned char *buffer;
AVIOContext *ioCtx;
int streamIndex;
AVFormatContext *formatCtx;
AVCodecContext *codecCtx;
AVFrame *lastDecodedFrame;
AVPacket *lastReadPacket;
int sampleBufferSize;
uint8_t *sampleBuffer;
int metadataUpdateInterval;
int metadataUpdateCount;
BOOL metadataUpdated;
AudioChunk *prebufferedChunk;
BOOL rawDSD;
BOOL rawDSDReverseBits;
BOOL rawDSDPlanar;
int bytesConsumedFromDecodedFrame;
BOOL readNextPacket;
int64_t seekFrame;
int64_t skipSamples;
BOOL endOfStream;
BOOL endOfAudio;
int metadataIndex;
int attachedPicIndex;
NSData *albumArt;
NSDictionary *metaDict;
NSDictionary *id3Metadata;
}
@end