mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
raspi: use decoder implementation from pidvbip
* remove ilclient * use a decoder implementation similar to pidvbip instead, see https://github.com/linuxstb/pidvbip * video is decoded in hardware (videocore) * audio is decoded by libavcodec * add a AVDec wrapper class for both audio and video decoders * very raw, needs more polishing. But decodes audio and video :-) * only tested with h264
This commit is contained in:
91
raspi/codec.h
Normal file
91
raspi/codec.h
Normal file
@@ -0,0 +1,91 @@
|
||||
#ifndef _CODEC_H
|
||||
#define _CODEC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <pthread.h>
|
||||
#include <libavformat/avformat.h>
|
||||
|
||||
#include "omx_utils.h"
|
||||
|
||||
struct codec_init_args_t
|
||||
{
|
||||
struct codec_t* codec;
|
||||
struct omx_pipeline_t* pipe;
|
||||
char* audio_dest;
|
||||
};
|
||||
|
||||
struct packet_t
|
||||
{
|
||||
unsigned char* buf; /* The buffer to be freed after use */
|
||||
unsigned char* packet; /* Pointer to the actual video data (within buf) */
|
||||
int packetlength; /* Number of bytes in packet */
|
||||
int frametype;
|
||||
int64_t PTS;
|
||||
int64_t DTS;
|
||||
};
|
||||
|
||||
#define MSG_PACKET 1
|
||||
#define MSG_PLAY 2
|
||||
#define MSG_STOP 3
|
||||
#define MSG_PAUSE 4
|
||||
#define MSG_NEW_CHANNEL 5
|
||||
#define MSG_ZOOM 6
|
||||
#define MSG_SET_ASPECT_4_3 7
|
||||
#define MSG_SET_ASPECT_16_9 8
|
||||
#define MSG_SET_VOLUME 9
|
||||
|
||||
struct codec_queue_t
|
||||
{
|
||||
int msgtype;
|
||||
struct packet_t* data;
|
||||
struct codec_queue_t* prev;
|
||||
struct codec_queue_t* next;
|
||||
};
|
||||
|
||||
struct codec_t
|
||||
{
|
||||
void* codecstate;
|
||||
int is_running;
|
||||
pthread_t thread;
|
||||
pthread_mutex_t queue_mutex;
|
||||
pthread_cond_t queue_count_cv;
|
||||
pthread_cond_t resume_cv;
|
||||
struct codec_queue_t* queue_head;
|
||||
struct codec_queue_t* queue_tail;
|
||||
int queue_count;
|
||||
int64_t PTS;
|
||||
pthread_mutex_t PTS_mutex;
|
||||
pthread_mutex_t isrunning_mutex;
|
||||
struct codec_t* acodec;
|
||||
OMX_VIDEO_CODINGTYPE vcodectype;
|
||||
int width;
|
||||
int height;
|
||||
enum CodecID acodectype;
|
||||
int first_packet;
|
||||
};
|
||||
|
||||
struct codecs_t {
|
||||
pthread_mutex_t playback_mutex; /* Locked by the thread with access to playback - htsp/avplay/etc */
|
||||
|
||||
struct codec_t vcodec;
|
||||
struct codec_t acodec; // Audio
|
||||
struct codec_t scodec; // Subtitles
|
||||
// struct htsp_subscription_t subscription; // Details of the currently tuned channel
|
||||
int is_paused;
|
||||
};
|
||||
|
||||
void codec_queue_init(struct codec_t* codec);
|
||||
void codec_new_channel(struct codec_t* codec);
|
||||
void codec_stop(struct codec_t* codec);
|
||||
void codec_send_message(struct codec_t* codec, int m, void* data);
|
||||
void codec_pause(struct codec_t* codec);
|
||||
void codec_resume(struct codec_t* codec);
|
||||
void codec_queue_add_item(struct codec_t* codec, struct packet_t* packet, int msgtype);
|
||||
void codec_queue_free_item(struct codec_t* codec,struct codec_queue_t* item);
|
||||
struct codec_queue_t* codec_queue_get_next_item(struct codec_t* codec);
|
||||
void codec_set_pts(struct codec_t* codec, int64_t PTS);
|
||||
int64_t codec_get_pts(struct codec_t* codec);
|
||||
int codec_is_running(struct codec_t* codec);
|
||||
void codec_flush_queue(struct codec_t* codec);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user