libeplayer3: run through indent, no binary change

This commit is contained in:
martii
2013-11-21 19:40:47 +01:00
committed by Stefan Seyfried
parent c229a6019d
commit 129206c5db
48 changed files with 6646 additions and 5859 deletions

View File

@@ -44,12 +44,13 @@ if (debug_level >= level) printf(x); } while (0)
static const char FILENAME[] = "container.c";
static Container_t * AvailableContainer[] = {
static Container_t *AvailableContainer[] = {
&FFMPEGContainer,
NULL
};
static void printContainerCapabilities() {
static void printContainerCapabilities()
{
int i, j;
container_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
@@ -57,24 +58,30 @@ static void printContainerCapabilities() {
for (i = 0; AvailableContainer[i] != NULL; i++)
for (j = 0; AvailableContainer[i]->Capabilities[j] != NULL; j++)
container_printf(10, "%s ", AvailableContainer[i]->Capabilities[j]);
container_printf(10, "%s ",
AvailableContainer[i]->Capabilities[j]);
container_printf(10, "\n");
}
static int selectContainer(Context_t *context, char * extension __attribute__((unused))) {
static int selectContainer(Context_t * context, char *extension
__attribute__ ((unused)))
{
#if 0
int i, j;
int ret = -1;
container_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
for (i = 0; AvailableContainer[i] != NULL; i++)
{
for (i = 0; AvailableContainer[i] != NULL; i++) {
for (j = 0; AvailableContainer[i]->Capabilities[j] != NULL; j++)
if (!strcasecmp(AvailableContainer[i]->Capabilities[j], extension)) {
context->container->selectedContainer = AvailableContainer[i];
if (!strcasecmp
(AvailableContainer[i]->Capabilities[j], extension)) {
context->container->selectedContainer =
AvailableContainer[i];
container_printf(10, "Selected Container: %s\n", context->container->selectedContainer->Name);
container_printf(10, "Selected Container: %s\n",
context->container->selectedContainer->
Name);
ret = 0;
break;
}
@@ -94,27 +101,29 @@ static int selectContainer(Context_t *context, char * extension __attribute__((
}
static int Command(void *_context, ContainerCmd_t command, void * argument) {
Context_t* context = (Context_t*) _context;
static int Command(void *_context, ContainerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = 0;
container_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
switch(command) {
case CONTAINER_ADD: {
ret = selectContainer(context, (char*) argument);
switch (command) {
case CONTAINER_ADD:{
ret = selectContainer(context, (char *) argument);
break;
}
case CONTAINER_CAPABILITIES: {
case CONTAINER_CAPABILITIES:{
printContainerCapabilities();
break;
}
case CONTAINER_DEL: {
case CONTAINER_DEL:{
context->container->selectedContainer = NULL;
break;
}
default:
container_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
container_err("%s::%s ContainerCmd %d not supported!\n", FILENAME,
__FUNCTION__, command);
break;
}

View File

@@ -84,24 +84,23 @@ if (debug_level >= level) printf("[%s:%s] " fmt, FILENAME, __FUNCTION__, ## x);
/* ***************************** */
typedef struct ass_s {
unsigned char* data;
unsigned char *data;
int len;
unsigned char* extradata;
unsigned char *extradata;
int extralen;
long long int pts;
float duration;
} ass_t;
typedef struct region_s
{
typedef struct region_s {
unsigned int x;
unsigned int y;
unsigned int w;
unsigned int h;
time_t undisplay;
struct region_s* next;
struct region_s *next;
} region_t;
/* ***************************** */
@@ -125,13 +124,13 @@ static unsigned int screen_width = 0;
static unsigned int screen_height = 0;
static uint32_t *destination = NULL;
static int destStride = 0;
static void (*framebufferBlit)(void) = NULL;
static void (*framebufferBlit) (void) = NULL;
static int needsBlit = 0;
static ASS_Track* ass_track = NULL;
static ASS_Track *ass_track = NULL;
static region_t* firstRegion = NULL;
static region_t *firstRegion = NULL;
/* ***************************** */
/* Prototypes */
@@ -141,7 +140,9 @@ static region_t* firstRegion = NULL;
/* MISC Functions */
/* ***************************** */
void ass_msg_callback(int level __attribute__((unused)), const char *format, va_list va, void *ctx __attribute__((unused)))
void ass_msg_callback(int level
__attribute__ ((unused)), const char *format,
va_list va, void *ctx __attribute__ ((unused)))
{
int n;
char *str;
@@ -156,7 +157,8 @@ void ass_msg_callback(int level __attribute__((unused)), const char *format, va_
}
}
static void getMutex(int line) {
static void getMutex(int line)
{
ass_printf(150, "%d requesting mutex\n", line);
pthread_mutex_lock(&mutex);
@@ -164,7 +166,8 @@ static void getMutex(int line) {
ass_printf(150, "%d received mutex\n", line);
}
static void releaseMutex(int line) {
static void releaseMutex(int line)
{
pthread_mutex_unlock(&mutex);
ass_printf(150, "%d released mutex\n", line);
@@ -178,24 +181,21 @@ static void releaseMutex(int line) {
*/
void releaseRegions()
{
region_t* next, *old;
Writer_t* writer;
region_t *next, *old;
Writer_t *writer;
if (firstRegion == NULL)
return;
writer = getDefaultFramebufferWriter();
if (writer == NULL)
{
if (writer == NULL) {
ass_err("no framebuffer writer found!\n");
}
next = firstRegion;
while (next)
{
if (writer)
{
while (next) {
if (writer) {
WriterFBCallData_t out;
ass_printf(100, "release: w %d h %d x %d y %d\n",
@@ -231,8 +231,8 @@ void releaseRegions()
void checkRegions()
{
#define cDeltaTime 2
region_t* next, *old, *prev;
Writer_t* writer;
region_t *next, *old, *prev;
Writer_t *writer;
time_t now = time(NULL);
if (firstRegion == NULL)
@@ -240,20 +240,17 @@ void checkRegions()
writer = getDefaultFramebufferWriter();
if (!writer)
{
if (!writer) {
ass_err("no framebuffer writer found!\n");
}
prev = next = firstRegion;
while (next)
{
if (now > next->undisplay + cDeltaTime)
{
ass_printf(100, "undisplay: %ld > %ld\n", now, next->undisplay + cDeltaTime);
while (next) {
if (now > next->undisplay + cDeltaTime) {
ass_printf(100, "undisplay: %ld > %ld\n", now,
next->undisplay + cDeltaTime);
if (writer)
{
if (writer) {
WriterFBCallData_t out;
ass_printf(100, "release: w %d h %d x %d y %d\n",
@@ -280,8 +277,7 @@ void checkRegions()
if (old == firstRegion)
firstRegion = next;
free(old);
} else
{
} else {
prev = next;
next = next->next;
}
@@ -289,9 +285,10 @@ void checkRegions()
}
/* store a display region for later release */
void storeRegion(unsigned int x, unsigned int y, unsigned int w, unsigned int h, time_t undisplay)
void storeRegion(unsigned int x, unsigned int y, unsigned int w,
unsigned int h, time_t undisplay)
{
region_t** new = &firstRegion;
region_t **new = &firstRegion;
ass_printf(100, "%d %d %d %d %ld\n", x, y, w, h, undisplay);
@@ -312,17 +309,17 @@ void storeRegion(unsigned int x, unsigned int y, unsigned int w, unsigned int h,
/* Worker Thread */
/* **************************** */
static void ASSThread(Context_t *context) {
static void ASSThread(Context_t * context)
{
char threadname[17];
strncpy(threadname, __func__, sizeof(threadname));
threadname[16] = 0;
prctl (PR_SET_NAME, (unsigned long)&threadname);
Writer_t* writer;
prctl(PR_SET_NAME, (unsigned long) &threadname);
Writer_t *writer;
ass_printf(10, "\n");
while ( context->playback->isCreationPhase )
{
while (context->playback->isCreationPhase) {
ass_err("Thread waiting for end of init phase...\n");
usleep(1000);
}
@@ -331,12 +328,11 @@ static void ASSThread(Context_t *context) {
writer = getDefaultFramebufferWriter();
if (writer == NULL)
{
if (writer == NULL) {
ass_err("no framebuffer writer found!\n");
}
while ( context && context->playback && context->playback->isPlaying ) {
while (context && context->playback && context->playback->isPlaying) {
//IF MOVIE IS PAUSED, WAIT
if (context->playback->isPaused) {
@@ -353,36 +349,36 @@ static void ASSThread(Context_t *context) {
continue;
}
if ((isContainerRunning) && (ass_track))
{
ASS_Image * img = NULL;
if ((isContainerRunning) && (ass_track)) {
ASS_Image *img = NULL;
int change = 0;
unsigned long int playPts;
if (context && context->playback)
{
if (context->playback->Command(context, PLAYBACK_PTS, &playPts) < 0)
if (context && context->playback) {
if (context->playback->
Command(context, PLAYBACK_PTS, &playPts) < 0)
continue;
}
//FIXME: durch den sleep bleibt die cpu usage zw. 5 und 13%, ohne
// steigt sie bei Verwendung von subtiteln bis auf 95%.
// ich hoffe dadurch gehen keine subtitle verloren, wenn die playPts
// durch den sleep verschlafen wird. Besser w<>re es den n<>chsten
// subtitel zeitpunkt zu bestimmen und solange zu schlafen.
usleep(10000);
if(!context->playback->mayWriteToFramebuffer)
if (!context->playback->mayWriteToFramebuffer)
continue;
getMutex(__LINE__);
checkRegions();
if(ass_renderer && ass_track)
img = ass_render_frame(ass_renderer, ass_track, playPts / 90.0, &change);
if (ass_renderer && ass_track)
img =
ass_render_frame(ass_renderer, ass_track,
playPts / 90.0, &change);
ass_printf(150, "img %p pts %lu %f\n", img, playPts, playPts / 90.0);
ass_printf(150, "img %p pts %lu %f\n", img, playPts,
playPts / 90.0);
if(img && ass_renderer && ass_track)
{
if (img && ass_renderer && ass_track) {
/* the spec says, that if a new set of regions is present
* the complete display switches to the new state. So lets
* release the old regions on display.
@@ -394,7 +390,8 @@ static void ASSThread(Context_t *context) {
time_t undisplay = now + 10;
if (ass_track && ass_track->events)
undisplay = now + (ass_track->events->Duration + 500) / 90000;
undisplay =
now + (ass_track->events->Duration + 500) / 90000;
ASS_Image *it;
int x0 = screen_width - 1;
@@ -413,13 +410,15 @@ static void ASSThread(Context_t *context) {
y1 = it->dst_y + it->h;
}
}
if (x1 > 0 && y1 > 0)
{
if (x1 > 0 && y1 > 0) {
x1++;
y1++;
int x, y;
uint32_t *dst = destination + y0 * destStride/sizeof(uint32_t) + x0;
int destStrideDiff = destStride/sizeof(uint32_t) - (x1 - x0);
uint32_t *dst =
destination + y0 * destStride / sizeof(uint32_t) +
x0;
int destStrideDiff =
destStride / sizeof(uint32_t) - (x1 - x0);
for (y = y0; y < y1; y++) {
for (x = x0; x < x1; x++)
*dst++ = 0x80808080;
@@ -429,20 +428,20 @@ static void ASSThread(Context_t *context) {
needsBlit = 1;
}
while (context && context->playback && context->playback->isPlaying && img)
{
while (context && context->playback
&& context->playback->isPlaying && img) {
WriterFBCallData_t out;
ass_printf(100, "w %d h %d s %d x %d y %d c %d chg %d now %ld und %ld\n",
img->w, img->h, img->stride,
img->dst_x, img->dst_y, img->color,
change, now, undisplay);
ass_printf(100,
"w %d h %d s %d x %d y %d c %d chg %d now %ld und %ld\n",
img->w, img->h, img->stride, img->dst_x,
img->dst_y, img->color, change, now,
undisplay);
/* api docu said w and h can be zero which
* means image should not be rendered
*/
if ((img->w != 0) && (img->h != 0) && writer)
{
if ((img->w != 0) && (img->h != 0) && writer) {
out.data = img->bitmap;
out.Width = img->w;
out.Height = img->h;
@@ -456,7 +455,8 @@ static void ASSThread(Context_t *context) {
out.destination = destination;
out.destStride = destStride;
if(context && context->playback && context->playback->isPlaying && writer)
if (context && context->playback
&& context->playback->isPlaying && writer)
writer->writeData(&out);
needsBlit = 1;
@@ -467,8 +467,7 @@ static void ASSThread(Context_t *context) {
}
}
releaseMutex(__LINE__);
} else
{
} else {
usleep(1000);
}
@@ -496,7 +495,7 @@ static void ASSThread(Context_t *context) {
/* Container part for ass */
/* **************************** */
int container_ass_init(Context_t *context)
int container_ass_init(Context_t * context)
{
SubtitleOutputDef_t output;
@@ -512,8 +511,8 @@ int container_ass_init(Context_t *context)
if (debug_level >= 100)
ass_set_message_cb(ass_library, ass_msg_callback, NULL);
ass_set_extract_fonts( ass_library, 1 );
ass_set_style_overrides( ass_library, NULL );
ass_set_extract_fonts(ass_library, 1);
ass_set_style_overrides(ass_library, NULL);
ass_renderer = ass_renderer_init(ass_library);
@@ -527,7 +526,8 @@ int container_ass_init(Context_t *context)
return cERR_CONTAINER_ASS_ERROR;
}
context->output->subtitle->Command(context, OUTPUT_GET_SUBTITLE_OUTPUT, &output);
context->output->subtitle->Command(context, OUTPUT_GET_SUBTITLE_OUTPUT,
&output);
screen_width = output.screen_width;
screen_height = output.screen_height;
@@ -538,8 +538,10 @@ int container_ass_init(Context_t *context)
ass_printf(10, "width %d, height %d\n", screen_width, screen_height);
ass_set_frame_size(ass_renderer, screen_width, screen_height);
ass_set_margins(ass_renderer, (int)(0.03 * screen_height), (int)(0.03 * screen_height) ,
(int)(0.03 * screen_width ), (int)(0.03 * screen_width ) );
ass_set_margins(ass_renderer, (int) (0.03 * screen_height),
(int) (0.03 * screen_height),
(int) (0.03 * screen_width),
(int) (0.03 * screen_width));
ass_set_use_margins(ass_renderer, 1);
// ass_set_font_scale(ass_renderer, (ass_font_scale * screen_height) / 240.0);
@@ -548,32 +550,31 @@ int container_ass_init(Context_t *context)
// ass_set_line_spacing(ass_renderer, (ass_line_spacing * screen_height) / 240.0);
ass_set_fonts(ass_renderer, ASS_FONT, "Arial", 0, NULL, 1);
ass_set_aspect_ratio( ass_renderer, 1.0, 1.0);
ass_set_aspect_ratio(ass_renderer, 1.0, 1.0);
isContainerRunning = 1;
return cERR_CONTAINER_ASS_NO_ERROR;
}
int container_ass_process_data(Context_t *context __attribute__((unused)), SubtitleData_t* data)
int container_ass_process_data(Context_t * context
__attribute__ ((unused)),
SubtitleData_t * data)
{
int first_kiss;
ass_printf(20, ">\n");
if (!isContainerRunning)
{
if (!isContainerRunning) {
ass_err("Container not running\n");
return cERR_CONTAINER_ASS_ERROR;
}
if (ass_track == NULL)
{
if (ass_track == NULL) {
first_kiss = 1;
ass_track = ass_new_track(ass_library);
if (ass_track == NULL)
{
if (ass_track == NULL) {
ass_err("error creating ass_track\n");
return cERR_CONTAINER_ASS_ERROR;
}
@@ -581,44 +582,45 @@ int container_ass_process_data(Context_t *context __attribute__((unused)), Subti
ass_track->PlayResY = screen_height;
}
if ((data->extradata) && (first_kiss))
{
ass_printf(30,"processing private %d bytes\n",data->extralen);
ass_process_codec_private(ass_track, (char*) data->extradata, data->extralen);
ass_printf(30,"processing private done\n");
if ((data->extradata) && (first_kiss)) {
ass_printf(30, "processing private %d bytes\n", data->extralen);
ass_process_codec_private(ass_track, (char *) data->extradata,
data->extralen);
ass_printf(30, "processing private done\n");
}
if (data->data)
{
ass_printf(30,"processing data %d bytes\n",data->len);
ass_process_data(ass_track, (char*) data->data, data->len);
ass_printf(30,"processing data done\n");
if (data->data) {
ass_printf(30, "processing data %d bytes\n", data->len);
ass_process_data(ass_track, (char *) data->data, data->len);
ass_printf(30, "processing data done\n");
}
return cERR_CONTAINER_ASS_NO_ERROR;
}
static int container_ass_stop(Context_t *context __attribute__((unused))) {
static int container_ass_stop(Context_t * context __attribute__ ((unused)))
{
int ret = cERR_CONTAINER_ASS_NO_ERROR;
int wait_time = 20;
Writer_t* writer;
Writer_t *writer;
ass_printf(10, "\n");
if (!isContainerRunning)
{
if (!isContainerRunning) {
ass_err("Container not running\n");
return cERR_CONTAINER_ASS_ERROR;
}
while ( (hasPlayThreadStarted != 0) && (--wait_time) > 0 ) {
ass_printf(10, "Waiting for ass thread to terminate itself, will try another %d times\n", wait_time);
while ((hasPlayThreadStarted != 0) && (--wait_time) > 0) {
ass_printf(10,
"Waiting for ass thread to terminate itself, will try another %d times\n",
wait_time);
usleep(100000);
}
if (wait_time == 0) {
ass_err( "Timeout waiting for thread!\n");
ass_err("Timeout waiting for thread!\n");
ret = cERR_CONTAINER_ASS_ERROR;
}
@@ -656,7 +658,8 @@ static int container_ass_stop(Context_t *context __attribute__((unused))) {
return ret;
}
static int container_ass_switch_subtitle(Context_t* context, int* arg __attribute__((unused)))
static int container_ass_switch_subtitle(Context_t * context, int *arg
__attribute__ ((unused)))
{
int error;
int ret = cERR_CONTAINER_ASS_NO_ERROR;
@@ -664,16 +667,14 @@ static int container_ass_switch_subtitle(Context_t* context, int* arg __attribut
ass_printf(10, "\n");
if (!isContainerRunning)
{
if (!isContainerRunning) {
ass_err("Container not running\n");
return cERR_CONTAINER_ASS_ERROR;
}
if ( context && context->playback && context->playback->isPlaying ) {
if (context && context->playback && context->playback->isPlaying) {
ass_printf(10, "is Playing\n");
}
else {
} else {
ass_printf(10, "is NOT Playing\n");
}
@@ -681,19 +682,20 @@ static int container_ass_switch_subtitle(Context_t* context, int* arg __attribut
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if((error = pthread_create(&PlayThread, &attr, (void *)&ASSThread, context)) != 0) {
ass_printf(10, "Error creating thread, error:%d:%s\n", error,strerror(error));
if ((error =
pthread_create(&PlayThread, &attr, (void *) &ASSThread,
context)) != 0) {
ass_printf(10, "Error creating thread, error:%d:%s\n", error,
strerror(error));
hasPlayThreadStarted = 0;
ret = cERR_CONTAINER_ASS_ERROR;
}
else {
} else {
ass_printf(10, "Created thread\n");
hasPlayThreadStarted = 1;
}
}
else {
} else {
ass_printf(10, "A thread already exists!\n");
ret = cERR_CONTAINER_ASS_ERROR;
@@ -719,29 +721,28 @@ static int container_ass_switch_subtitle(Context_t* context, int* arg __attribut
}
static int Command(void *_context, ContainerCmd_t command, void * argument)
static int Command(void *_context, ContainerCmd_t command, void *argument)
{
Context_t *context = (Context_t*) _context;
Context_t *context = (Context_t *) _context;
int ret = cERR_CONTAINER_ASS_NO_ERROR;
ass_printf(50, "Command %d\n", command);
switch(command)
{
case CONTAINER_INIT: {
switch (command) {
case CONTAINER_INIT:{
ret = container_ass_init(context);
break;
}
case CONTAINER_STOP: {
case CONTAINER_STOP:{
ret = container_ass_stop(context);
break;
}
case CONTAINER_SWITCH_SUBTITLE: {
ret = container_ass_switch_subtitle(context, (int*) argument);
case CONTAINER_SWITCH_SUBTITLE:{
ret = container_ass_switch_subtitle(context, (int *) argument);
break;
}
case CONTAINER_DATA: {
SubtitleData_t* data = (SubtitleData_t*) argument;
case CONTAINER_DATA:{
SubtitleData_t *data = (SubtitleData_t *) argument;
ret = container_ass_process_data(context, data);
break;
}
@@ -756,7 +757,7 @@ static int Command(void *_context, ContainerCmd_t command, void * argument)
return ret;
}
static char *ASS_Capabilities[] = {"ass", NULL };
static char *ASS_Capabilities[] = { "ass", NULL };
Container_t ASSContainer = {
"ASS",

File diff suppressed because it is too large Load Diff

View File

@@ -74,7 +74,7 @@ static const char FILENAME[] = "text_srt.c";
/* ***************************** */
typedef struct {
char * File;
char *File;
int Id;
} SrtTrack_t;
@@ -84,11 +84,11 @@ static pthread_t thread_sub;
/* Varaibles */
/* ***************************** */
static SrtTrack_t * Tracks;
static SrtTrack_t *Tracks;
static int TrackCount = 0;
static int CurrentTrack = -1; //no as default.
FILE * fsub = NULL;
FILE *fsub = NULL;
static int hasThreadStarted = 0;
@@ -100,27 +100,28 @@ static int hasThreadStarted = 0;
/* MISC Functions */
/* ***************************** */
void data_to_manager(Context_t *context, char* Text, unsigned long long int Pts, double Duration)
void data_to_manager(Context_t * context, char *Text,
unsigned long long int Pts, double Duration)
{
srt_printf(20, "--> Text= \"%s\"\n", Text);
if( context &&
context->playback &&
context->playback->isPlaying){
int sl = strlen(Text)-1;
while(sl && (Text[sl]=='\n' || Text[sl]=='\r')) Text[sl--]='\0'; /*Delete last \n or \r */
unsigned char* line = text_to_ass(Text, Pts, Duration);
srt_printf(50,"Sub text is %s\n",Text);
srt_printf(50,"Sub line is %s\n",line);
if (context && context->playback && context->playback->isPlaying) {
int sl = strlen(Text) - 1;
while (sl && (Text[sl] == '\n' || Text[sl] == '\r'))
Text[sl--] = '\0'; /*Delete last \n or \r */
unsigned char *line = text_to_ass(Text, Pts, Duration);
srt_printf(50, "Sub text is %s\n", Text);
srt_printf(50, "Sub line is %s\n", line);
SubtitleData_t data;
data.data = line;
data.len = strlen((char*)line);
data.len = strlen((char *) line);
data.extradata = (unsigned char *) DEFAULT_ASS_HEAD;
data.extralen = strlen(DEFAULT_ASS_HEAD);
data.pts = Pts*90;
data.pts = Pts * 90;
data.duration = Duration;
context->container->assContainer->Command(context, CONTAINER_DATA, &data);
context->container->assContainer->Command(context, CONTAINER_DATA,
&data);
free(line);
}
@@ -131,42 +132,51 @@ void data_to_manager(Context_t *context, char* Text, unsigned long long int Pts,
/* Worker Thread */
/* ***************************** */
static void* SrtSubtitleThread(void *data) {
static void *SrtSubtitleThread(void *data)
{
int pos = 0;
char Data[MAXLINELENGTH];
unsigned long long int Pts = 0;
double Duration = 0;
char * Text = NULL;
char *Text = NULL;
Context_t *context = (Context_t*) data;
Context_t *context = (Context_t *) data;
srt_printf(10, "\n");
while(context && context->playback && context->playback->isPlaying && fsub && fgets(Data, MAXLINELENGTH, fsub)) {
while (context && context->playback && context->playback->isPlaying
&& fsub && fgets(Data, MAXLINELENGTH, fsub)) {
srt_printf(20, "pos=%d\n", pos);
if(pos == 0)
{
if(Data[0] == '\n' || Data[0] == '\0' || Data[0] == 13 /* ^M */)
if (pos == 0) {
if (Data[0] == '\n' || Data[0] == '\0'
|| Data[0] == 13 /* ^M */ )
continue; /* Empty line not allowed here */
pos++;
} else if(pos == 1)
{
int ret, horIni, minIni, secIni, milIni, horFim, minFim, secFim, milFim;
} else if (pos == 1) {
int ret, horIni, minIni, secIni, milIni, horFim, minFim,
secFim, milFim;
ret = sscanf(Data, "%d:%d:%d,%d --> %d:%d:%d,%d", &horIni, &minIni, &secIni, &milIni, &horFim, &minFim, &secFim, &milFim);
if (ret!=8) continue; /* Data is not in correct format */
ret =
sscanf(Data, "%d:%d:%d,%d --> %d:%d:%d,%d", &horIni,
&minIni, &secIni, &milIni, &horFim, &minFim,
&secFim, &milFim);
if (ret != 8)
continue; /* Data is not in correct format */
Pts = (horIni*3600 + minIni*60 + secIni)*1000 + milIni;
Duration = ((horFim*3600 + minFim*60 + secFim) * 1000 + milFim - Pts) / 1000.0;
Pts = (horIni * 3600 + minIni * 60 + secIni) * 1000 + milIni;
Duration =
((horFim * 3600 + minFim * 60 + secFim) * 1000 + milFim -
Pts) / 1000.0;
pos++;
} else if(pos == 2) {
} else if (pos == 2) {
srt_printf(20, "Data[0] = %d \'%c\'\n", Data[0], Data[0]);
if(Data[0] == '\n' || Data[0] == '\0' || Data[0] == 13 /* ^M */) {
if(Text == NULL)
if (Data[0] == '\n' || Data[0] == '\0'
|| Data[0] == 13 /* ^M */ ) {
if (Text == NULL)
Text = strdup(" \n"); /* better to display at least one character */
/*Hellmaster 1024 since we have waited, we have to check if we are still paying */
@@ -177,12 +187,14 @@ static void* SrtSubtitleThread(void *data) {
continue;
}
if(!Text) {
if (!Text) {
Text = strdup(Data);
} else {
int length = strlen(Text) /* \0 -> \n */ + strlen(Data) + 2 /* \0 */;
char * tmpText = Text;
Text = (char*)malloc(length);
int length =
strlen(Text) /* \0 -> \n */ +strlen(Data) +
2 /* \0 */ ;
char *tmpText = Text;
Text = (char *) malloc(length);
strcpy(Text, tmpText);
strcat(Text, Data);
@@ -193,7 +205,7 @@ static void* SrtSubtitleThread(void *data) {
hasThreadStarted = 0;
if(Text) {
if (Text) {
data_to_manager(context, Text, Pts, Duration);
free(Text);
Text = NULL;
@@ -208,8 +220,10 @@ static void* SrtSubtitleThread(void *data) {
/* Functions */
/* ***************************** */
static void SrtManagerAdd(Context_t *context __attribute__((unused)), SrtTrack_t track) {
srt_printf(10, "%s %d\n",track.File, track.Id);
static void SrtManagerAdd(Context_t * context
__attribute__ ((unused)), SrtTrack_t track)
{
srt_printf(10, "%s %d\n", track.File, track.Id);
if (Tracks == NULL) {
Tracks = malloc(sizeof(SrtTrack_t) * TRACKWRAP);
@@ -223,8 +237,9 @@ static void SrtManagerAdd(Context_t *context __attribute__((unused)), SrtTrack_
}
#if 0
static char ** SrtManagerList(Context_t *context __attribute__((unused))) {
char ** tracklist = NULL;
static char **SrtManagerList(Context_t * context __attribute__ ((unused)))
{
char **tracklist = NULL;
srt_printf(10, "\n");
@@ -232,13 +247,13 @@ static char ** SrtManagerList(Context_t *context __attribute__((unused))) {
char help[256];
int i = 0, j = 0;
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
sprintf(help, "%d", Tracks[i].Id);
tracklist[j] = strdup(help);
tracklist[j+1] = strdup(Tracks[i].File);
tracklist[j + 1] = strdup(Tracks[i].File);
}
tracklist[j] = NULL;
}
@@ -247,12 +262,13 @@ static char ** SrtManagerList(Context_t *context __attribute__((unused))) {
}
#endif
static void SrtManagerDel(Context_t * context __attribute__((unused))) {
static void SrtManagerDel(Context_t * context __attribute__ ((unused)))
{
int i = 0;
srt_printf(10, "\n");
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
if (Tracks[i].File != NULL)
free(Tracks[i].File);
@@ -267,19 +283,19 @@ static void SrtManagerDel(Context_t * context __attribute__((unused))) {
}
static int SrtGetSubtitle(Context_t *context, char * Filename) {
static int SrtGetSubtitle(Context_t * context, char *Filename)
{
struct dirent *dirzeiger;
DIR * dir;
DIR *dir;
int i = TEXTSRTOFFSET;
char * copyFilename = NULL;
char * FilenameExtension = NULL;
char * FilenameFolder = NULL;
char * FilenameShort = NULL;
char *copyFilename = NULL;
char *FilenameExtension = NULL;
char *FilenameFolder = NULL;
char *FilenameShort = NULL;
srt_printf(10, "\n");
if (Filename == NULL)
{
if (Filename == NULL) {
srt_err("Filename NULL\n");
return cERR_SRT_ERROR;
}
@@ -288,8 +304,7 @@ static int SrtGetSubtitle(Context_t *context, char * Filename) {
copyFilename = strdup(Filename);
if (copyFilename == NULL)
{
if (copyFilename == NULL) {
srt_err("copyFilename NULL\n");
return cERR_SRT_ERROR;
}
@@ -300,8 +315,7 @@ static int SrtGetSubtitle(Context_t *context, char * Filename) {
FilenameExtension = getExtension(copyFilename);
if (FilenameExtension == NULL)
{
if (FilenameExtension == NULL) {
srt_err("FilenameExtension NULL\n");
free(copyFilename);
return cERR_SRT_ERROR;
@@ -312,17 +326,19 @@ static int SrtGetSubtitle(Context_t *context, char * Filename) {
FilenameShort = basename(copyFilename);
/* cut extension */
FilenameShort[strlen(FilenameShort) - strlen(FilenameExtension) - 1] = '\0';
FilenameShort[strlen(FilenameShort) - strlen(FilenameExtension) - 1] =
'\0';
srt_printf(10, "basename: %s\n", FilenameShort);
srt_printf(10, "%s\n%s | %s | %s\n", copyFilename, FilenameFolder, FilenameShort, FilenameExtension);
srt_printf(10, "%s\n%s | %s | %s\n", copyFilename, FilenameFolder,
FilenameShort, FilenameExtension);
if((dir = opendir(FilenameFolder)) != NULL) {
while((dirzeiger = readdir(dir)) != NULL) {
if ((dir = opendir(FilenameFolder)) != NULL) {
while ((dirzeiger = readdir(dir)) != NULL) {
char subtitleFilename[PATH_MAX];
char *subtitleExtension = NULL;
srt_printf(20, "%s\n",(*dirzeiger).d_name);
srt_printf(20, "%s\n", (*dirzeiger).d_name);
strcpy(subtitleFilename, (*dirzeiger).d_name);
@@ -336,18 +352,22 @@ static int SrtGetSubtitle(Context_t *context, char * Filename) {
continue;
/* cut extension */
subtitleFilename[strlen(subtitleFilename) - strlen(subtitleExtension) - 1] = '\0';
subtitleFilename[strlen(subtitleFilename) -
strlen(subtitleExtension) - 1] = '\0';
srt_printf(10, "%s %s\n", FilenameShort, subtitleFilename);
if (strncmp(FilenameShort, subtitleFilename,strlen(FilenameShort)) == 0)
{
if (strncmp
(FilenameShort, subtitleFilename,
strlen(FilenameShort)) == 0) {
char absSubtitleFileName[PATH_MAX];
/* found something of interest, so now make an absolut path name */
sprintf(absSubtitleFileName, "%s/%s.%s", FilenameFolder, subtitleFilename, subtitleExtension);
sprintf(absSubtitleFileName, "%s/%s.%s", FilenameFolder,
subtitleFilename, subtitleExtension);
srt_printf(10, "SRT: %s [%s]\n", subtitleExtension, subtitleFilename);
srt_printf(10, "SRT: %s [%s]\n", subtitleExtension,
subtitleFilename);
srt_printf(10, "\t->%s\n", absSubtitleFileName);
SrtTrack_t SrtSubtitle = {
@@ -362,22 +382,26 @@ static int SrtGetSubtitle(Context_t *context, char * Filename) {
Subtitle.Name = subtitleExtension;
Subtitle.Encoding = "S_TEXT/SRT";
Subtitle.Id = i++,
context->manager->subtitle->Command(context, MANAGER_ADD, &Subtitle);
context->manager->subtitle->Command(context,
MANAGER_ADD,
&Subtitle);
}
} /* while */
closedir(dir);
} /* if dir */
}
/* if dir */
free(copyFilename);
srt_printf(10, "<\n");
return cERR_SRT_NO_ERROR;
}
static int SrtOpenSubtitle(Context_t *context __attribute__((unused)), int pid) {
static int SrtOpenSubtitle(Context_t * context
__attribute__ ((unused)), int pid)
{
srt_printf(10, "\n");
if(pid < TEXTSRTOFFSET) {
if (pid < TEXTSRTOFFSET) {
srt_err("trackid not for us\n");
return cERR_SRT_ERROR;
}
@@ -387,7 +411,7 @@ static int SrtOpenSubtitle(Context_t *context __attribute__((unused)), int pid)
if (Tracks[trackid].Id == pid)
break;
if(trackid == TrackCount) {
if (trackid == TrackCount) {
srt_err("trackid not for us\n");
return cERR_SRT_ERROR;
}
@@ -398,18 +422,18 @@ static int SrtOpenSubtitle(Context_t *context __attribute__((unused)), int pid)
srt_printf(10, "%s\n", fsub ? "fsub!=NULL" : "fsub==NULL");
if(!fsub)
{
if (!fsub) {
srt_err("cannot open file %s\n", Tracks[trackid].File);
return cERR_SRT_ERROR;
}
return cERR_SRT_NO_ERROR;
}
static int SrtCloseSubtitle(Context_t *context __attribute__((unused))) {
static int SrtCloseSubtitle(Context_t * context __attribute__ ((unused)))
{
srt_printf(10, "\n");
if(fsub)
if (fsub)
fclose(fsub);
/* this closes the thread! */
@@ -420,19 +444,20 @@ static int SrtCloseSubtitle(Context_t *context __attribute__((unused))) {
return cERR_SRT_NO_ERROR;
}
static int SrtSwitchSubtitle(Context_t *context, int* arg) {
static int SrtSwitchSubtitle(Context_t * context, int *arg)
{
int ret = cERR_SRT_NO_ERROR;
srt_printf(10, "arg:%d\n", *arg);
ret = SrtCloseSubtitle(context);
if (( (ret |= SrtOpenSubtitle(context, *arg)) == cERR_SRT_NO_ERROR) && (!hasThreadStarted))
{
if (((ret |= SrtOpenSubtitle(context, *arg)) == cERR_SRT_NO_ERROR)
&& (!hasThreadStarted)) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread_sub, &attr, &SrtSubtitleThread, context);
pthread_create(&thread_sub, &attr, &SrtSubtitleThread, context);
hasThreadStarted = 1;
}
@@ -440,7 +465,8 @@ static int SrtSwitchSubtitle(Context_t *context, int* arg) {
return ret;
}
static int SrtDel(Context_t *context) {
static int SrtDel(Context_t * context)
{
int ret = cERR_SRT_NO_ERROR;
srt_printf(10, "\n");
@@ -451,24 +477,25 @@ static int SrtDel(Context_t *context) {
return ret;
}
static int Command(void *_context, ContainerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ContainerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_SRT_NO_ERROR;
srt_printf(10, "\n");
switch(command) {
case CONTAINER_INIT: {
char * filename = (char *)argument;
switch (command) {
case CONTAINER_INIT:{
char *filename = (char *) argument;
ret = SrtGetSubtitle(context, filename);
break;
}
case CONTAINER_DEL: {
case CONTAINER_DEL:{
ret = SrtDel(context);
break;
}
case CONTAINER_SWITCH_SUBTITLE: {
ret = SrtSwitchSubtitle(context, (int*) argument);
case CONTAINER_SWITCH_SUBTITLE:{
ret = SrtSwitchSubtitle(context, (int *) argument);
break;
}
default:

View File

@@ -78,7 +78,7 @@ static const char FILENAME[] = "text_ssa.c";
/* ***************************** */
typedef struct {
char * File;
char *File;
int Id;
} SsaTrack_t;
@@ -88,9 +88,9 @@ typedef struct {
static pthread_t thread_sub;
static SsaTrack_t * Tracks;
static SsaTrack_t *Tracks;
static int TrackCount = 0;
FILE * fssa = NULL;
FILE *fssa = NULL;
static int hasThreadStarted = 0;
@@ -110,39 +110,35 @@ char *SSAgetLine()
k = tamAux = 0;
if(SSA_BUFFER_SIZE>0)
{
if (SSA_BUFFER_SIZE > 0) {
strInput = (char*)malloc(1*sizeof(char));
strInput[0]='\0';
strInput = (char *) malloc(1 * sizeof(char));
strInput[0] = '\0';
while(tamAux!=1)
{
while (tamAux != 1) {
if((ch = fgetc(fssa))!=EOF)
{
ungetc(ch , fssa);
if ((ch = fgetc(fssa)) != EOF) {
ungetc(ch, fssa);
fgets(c, SSA_BUFFER_SIZE, fssa);
strAux = (char*)strchr(c,'\n');
strAux = (char *) strchr(c, '\n');
tam = strlen(c);
if(strAux != NULL)
{
if (strAux != NULL) {
tamAux = strlen(strAux);
tam--;
}
k = k + tam;
strInput = (char*)realloc(strInput, (k+1)*sizeof(char));
strInput =
(char *) realloc(strInput, (k + 1) * sizeof(char));
if(k!=tam)
if (k != tam)
strncat(strInput, c, tam);
else
strncpy(strInput, c, tam);
strInput[k] = '\0';
}
else {
} else {
tamAux = 1;
fclose(fssa);
fssa = NULL;
@@ -158,43 +154,44 @@ char *SSAgetLine()
/* ***************************** */
/* Worker Thread */
/* ***************************** */
static void* SsaSubtitleThread(void *Data) {
Context_t *context = (Context_t*) Data;
char * head =malloc(sizeof(char)*1);
static void *SsaSubtitleThread(void *Data)
{
Context_t *context = (Context_t *) Data;
char *head = malloc(sizeof(char) * 1);
ssa_printf(10, "\n");
head[0]='\0';
head[0] = '\0';
while ( context && context->playback && context->playback->isPlaying && fssa ) {
while (context && context->playback && context->playback->isPlaying
&& fssa) {
char *line = NULL;
do
{
do {
line = SSAgetLine();
if(strncmp(line,"Dialogue: ",10)) {
if (strncmp(line, "Dialogue: ", 10)) {
int head_len = strlen(head);
int line_len = strlen(line);
head = realloc(head, line_len + head_len +2);
memcpy(head + head_len, line, sizeof(char)*line_len+1);
head = realloc(head, line_len + head_len + 2);
memcpy(head + head_len, line, sizeof(char) * line_len + 1);
head[head_len + line_len] = '\n';
head[head_len + line_len + 1] = '\0';
}
} while (strncmp(line,"Dialogue: ",10)!=0 && fssa);
} while (strncmp(line, "Dialogue: ", 10) != 0 && fssa);
/*Hellmaster 1024 since we have waited, we have to check if we are still paying */
if( context &&
context->playback &&
context->playback->isPlaying) {
if (context && context->playback && context->playback->isPlaying) {
SubtitleData_t data;
data.data = (unsigned char*) line;
data.data = (unsigned char *) line;
data.len = strlen(line);
data.extradata = (unsigned char*) head;
data.extradata = (unsigned char *) head;
data.extralen = strlen(head);
data.pts = 0;
data.duration = 0.0;
context->container->assContainer->Command(context, CONTAINER_DATA, &data);
context->container->assContainer->Command(context,
CONTAINER_DATA,
&data);
}
free(line);
line = NULL;
@@ -203,7 +200,7 @@ static void* SsaSubtitleThread(void *Data) {
hasThreadStarted = 0;
if(head) {
if (head) {
free(head);
head = NULL;
}
@@ -217,7 +214,9 @@ static void* SsaSubtitleThread(void *Data) {
/* Functions */
/* ***************************** */
static void SsaManagerAdd(Context_t *context __attribute__((unused)), SsaTrack_t track) {
static void SsaManagerAdd(Context_t * context
__attribute__ ((unused)), SsaTrack_t track)
{
ssa_printf(10, "%s %d\n", track.File, track.Id);
if (Tracks == NULL) {
@@ -232,8 +231,9 @@ static void SsaManagerAdd(Context_t *context __attribute__((unused)), SsaTrack_
}
#if 0
static char ** SsaManagerList(Context_t *context __attribute__((unused))) {
char ** tracklist = NULL;
static char **SsaManagerList(Context_t * context __attribute__ ((unused)))
{
char **tracklist = NULL;
ssa_printf(10, "\n");
@@ -241,13 +241,13 @@ static char ** SsaManagerList(Context_t *context __attribute__((unused))) {
char help[256];
int i = 0, j = 0;
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
sprintf(help, "%d", Tracks[i].Id);
tracklist[j] = strdup(help);
tracklist[j+1] = strdup(Tracks[i].File);
tracklist[j + 1] = strdup(Tracks[i].File);
}
tracklist[j] = NULL;
}
@@ -256,12 +256,13 @@ static char ** SsaManagerList(Context_t *context __attribute__((unused))) {
}
#endif
static void SsaManagerDel(Context_t * context __attribute__((unused))) {
static void SsaManagerDel(Context_t * context __attribute__ ((unused)))
{
int i = 0;
ssa_printf(10, "\n");
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
if (Tracks[i].File != NULL)
free(Tracks[i].File);
@@ -274,19 +275,19 @@ static void SsaManagerDel(Context_t * context __attribute__((unused))) {
TrackCount = 0;
}
static int SsaGetSubtitle(Context_t *context, char * Filename) {
static int SsaGetSubtitle(Context_t * context, char *Filename)
{
struct dirent *dirzeiger;
DIR * dir;
DIR *dir;
int i = TEXTSSAOFFSET;
char * copyFilename = NULL;
char * FilenameExtension = NULL;
char * FilenameFolder = NULL;
char * FilenameShort = NULL;
char *copyFilename = NULL;
char *FilenameExtension = NULL;
char *FilenameFolder = NULL;
char *FilenameShort = NULL;
ssa_printf(10, "\n");
if (Filename == NULL)
{
if (Filename == NULL) {
ssa_err("Filename NULL\n");
return cERR_SSA_ERROR;
}
@@ -295,8 +296,7 @@ static int SsaGetSubtitle(Context_t *context, char * Filename) {
copyFilename = strdup(Filename);
if (copyFilename == NULL)
{
if (copyFilename == NULL) {
ssa_err("copyFilename NULL\n");
return cERR_SSA_ERROR;
}
@@ -307,8 +307,7 @@ static int SsaGetSubtitle(Context_t *context, char * Filename) {
FilenameExtension = getExtension(copyFilename);
if (FilenameExtension == NULL)
{
if (FilenameExtension == NULL) {
ssa_err("FilenameExtension NULL\n");
free(copyFilename);
return cERR_SSA_ERROR;
@@ -319,17 +318,19 @@ static int SsaGetSubtitle(Context_t *context, char * Filename) {
FilenameShort = basename(copyFilename);
/* cut extension */
FilenameShort[strlen(FilenameShort) - strlen(FilenameExtension) - 1] = '\0';
FilenameShort[strlen(FilenameShort) - strlen(FilenameExtension) - 1] =
'\0';
ssa_printf(10, "basename: %s\n", FilenameShort);
ssa_printf(10, "%s\n%s | %s | %s\n", copyFilename, FilenameFolder, FilenameShort, FilenameExtension);
ssa_printf(10, "%s\n%s | %s | %s\n", copyFilename, FilenameFolder,
FilenameShort, FilenameExtension);
if((dir = opendir(FilenameFolder)) != NULL) {
while((dirzeiger = readdir(dir)) != NULL) {
if ((dir = opendir(FilenameFolder)) != NULL) {
while ((dirzeiger = readdir(dir)) != NULL) {
char subtitleFilename[PATH_MAX];
char *subtitleExtension = NULL;
ssa_printf(20, "%s\n",(*dirzeiger).d_name);
ssa_printf(20, "%s\n", (*dirzeiger).d_name);
strcpy(subtitleFilename, (*dirzeiger).d_name);
@@ -339,22 +340,27 @@ static int SsaGetSubtitle(Context_t *context, char * Filename) {
if (subtitleExtension == NULL)
continue;
if ( strcmp(subtitleExtension, "ssa") != 0 && strcmp(subtitleExtension, "ass") != 0 )
if (strcmp(subtitleExtension, "ssa") != 0
&& strcmp(subtitleExtension, "ass") != 0)
continue;
/* cut extension */
subtitleFilename[strlen(subtitleFilename) - strlen(subtitleExtension) - 1] = '\0';
subtitleFilename[strlen(subtitleFilename) -
strlen(subtitleExtension) - 1] = '\0';
ssa_printf(10, "%s %s\n", FilenameShort, subtitleFilename);
if (strncmp(FilenameShort, subtitleFilename,strlen(FilenameShort)) == 0)
{
if (strncmp
(FilenameShort, subtitleFilename,
strlen(FilenameShort)) == 0) {
char absSubtitleFileName[PATH_MAX];
/* found something of interest, so now make an absolut path name */
sprintf(absSubtitleFileName, "%s/%s.%s", FilenameFolder, subtitleFilename, subtitleExtension);
sprintf(absSubtitleFileName, "%s/%s.%s", FilenameFolder,
subtitleFilename, subtitleExtension);
ssa_printf(10, "SSA: %s [%s]\n", subtitleExtension, subtitleFilename);
ssa_printf(10, "SSA: %s [%s]\n", subtitleExtension,
subtitleFilename);
ssa_printf(10, "\t->%s\n", absSubtitleFileName);
SsaTrack_t SsaSubtitle = {
@@ -369,22 +375,25 @@ static int SsaGetSubtitle(Context_t *context, char * Filename) {
Subtitle.Name = subtitleExtension;
Subtitle.Encoding = "S_TEXT/SSA";
Subtitle.Id = i++;
context->manager->subtitle->Command(context, MANAGER_ADD, &Subtitle);
context->manager->subtitle->Command(context, MANAGER_ADD,
&Subtitle);
}
} /* while */
closedir(dir);
} /* if dir */
}
/* if dir */
free(copyFilename);
ssa_printf(10, "<\n");
return cERR_SSA_NO_ERROR;
}
static int SsaOpenSubtitle(Context_t *context __attribute__((unused)), int pid) {
static int SsaOpenSubtitle(Context_t * context
__attribute__ ((unused)), int pid)
{
ssa_printf(10, "\n");
if(pid < TEXTSSAOFFSET) {
if (pid < TEXTSSAOFFSET) {
ssa_err("trackid not for us\n");
return cERR_SSA_ERROR;
}
@@ -394,7 +403,7 @@ static int SsaOpenSubtitle(Context_t *context __attribute__((unused)), int pid)
if (Tracks[trackid].Id == pid)
break;
if(trackid == TrackCount) {
if (trackid == TrackCount) {
ssa_err("trackid not for us\n");
return cERR_SSA_ERROR;
}
@@ -405,18 +414,18 @@ static int SsaOpenSubtitle(Context_t *context __attribute__((unused)), int pid)
ssa_printf(10, "%s\n", fssa ? "fssa!=NULL" : "fssa==NULL");
if (!fssa)
{
if (!fssa) {
ssa_err("cannot open file %s\n", Tracks[trackid].File);
return cERR_SSA_ERROR;
}
return cERR_SSA_NO_ERROR;
}
static int SsaCloseSubtitle(Context_t *context __attribute__((unused))) {
static int SsaCloseSubtitle(Context_t * context __attribute__ ((unused)))
{
ssa_printf(10, "\n");
if(fssa)
if (fssa)
fclose(fssa);
/* this closes the thread! */
@@ -427,19 +436,20 @@ static int SsaCloseSubtitle(Context_t *context __attribute__((unused))) {
return cERR_SSA_NO_ERROR;
}
static int SsaSwitchSubtitle(Context_t *context, int* arg) {
static int SsaSwitchSubtitle(Context_t * context, int *arg)
{
int ret = cERR_SSA_NO_ERROR;
ssa_printf(10, "\n");
ret = SsaCloseSubtitle(context);
if (((ret |= SsaOpenSubtitle(context, *arg)) == cERR_SSA_NO_ERROR) && (!hasThreadStarted))
{
if (((ret |= SsaOpenSubtitle(context, *arg)) == cERR_SSA_NO_ERROR)
&& (!hasThreadStarted)) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread_sub, &attr, &SsaSubtitleThread, context);
pthread_create(&thread_sub, &attr, &SsaSubtitleThread, context);
hasThreadStarted = 1;
}
@@ -447,7 +457,8 @@ static int SsaSwitchSubtitle(Context_t *context, int* arg) {
return ret;
}
static int SsaDel(Context_t *context) {
static int SsaDel(Context_t * context)
{
int ret = cERR_SSA_NO_ERROR;
ssa_printf(10, "\n");
@@ -459,24 +470,25 @@ static int SsaDel(Context_t *context) {
return ret;
}
static int Command(void *_context, ContainerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ContainerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_SSA_NO_ERROR;
ssa_printf(10, "\n");
switch(command) {
case CONTAINER_INIT: {
char * filename = (char *)argument;
switch (command) {
case CONTAINER_INIT:{
char *filename = (char *) argument;
ret = SsaGetSubtitle(context, filename);
break;
}
case CONTAINER_DEL: {
case CONTAINER_DEL:{
ret = SsaDel(context);
break;
}
case CONTAINER_SWITCH_SUBTITLE: {
ret = SsaSwitchSubtitle(context, (int*) argument);
case CONTAINER_SWITCH_SUBTITLE:{
ret = SsaSwitchSubtitle(context, (int *) argument);
break;
}
default:

View File

@@ -22,7 +22,7 @@
#define AAC_HEADER_LENGTH 7
static inline int aac_get_sample_rate_index (uint32_t sample_rate)
static inline int aac_get_sample_rate_index(uint32_t sample_rate)
{
if (96000 <= sample_rate)
return 0;

View File

@@ -8,11 +8,12 @@
#include <pthread.h>
typedef struct Context_s {
PlaybackHandler_t * playback;
ContainerHandler_t * container;
OutputHandler_t * output;
ManagerHandler_t * manager;
PlaybackHandler_t *playback;
ContainerHandler_t *container;
OutputHandler_t *output;
ManagerHandler_t *manager;
} Context_t;
int container_ffmpeg_update_tracks(Context_t *context, char *filename, int initial);
int container_ffmpeg_update_tracks(Context_t * context, char *filename,
int initial);
#endif

View File

@@ -4,29 +4,29 @@
#include <stdio.h>
typedef enum {
CONTAINER_INIT,
CONTAINER_ADD,
CONTAINER_CAPABILITIES,
CONTAINER_PLAY,
CONTAINER_STOP,
CONTAINER_SEEK,
CONTAINER_SEEK_ABS,
CONTAINER_LENGTH,
CONTAINER_DEL,
CONTAINER_SWITCH_AUDIO,
CONTAINER_SWITCH_SUBTITLE,
CONTAINER_SWITCH_DVBSUBTITLE,
CONTAINER_SWITCH_TELETEXT,
CONTAINER_INFO,
CONTAINER_STATUS,
CONTAINER_LAST_PTS,
CONTAINER_DATA
CONTAINER_INIT,
CONTAINER_ADD,
CONTAINER_CAPABILITIES,
CONTAINER_PLAY,
CONTAINER_STOP,
CONTAINER_SEEK,
CONTAINER_SEEK_ABS,
CONTAINER_LENGTH,
CONTAINER_DEL,
CONTAINER_SWITCH_AUDIO,
CONTAINER_SWITCH_SUBTITLE,
CONTAINER_SWITCH_DVBSUBTITLE,
CONTAINER_SWITCH_TELETEXT,
CONTAINER_INFO,
CONTAINER_STATUS,
CONTAINER_LAST_PTS,
CONTAINER_DATA
} ContainerCmd_t;
typedef struct Container_s {
char * Name;
int (* Command) (/*Context_t*/void *, ContainerCmd_t, void *);
char ** Capabilities;
char *Name;
int (*Command) ( /*Context_t */ void *, ContainerCmd_t, void *);
char **Capabilities;
} Container_t;
@@ -34,13 +34,13 @@ typedef struct Container_s {
extern Container_t FFMPEGContainer;
typedef struct ContainerHandler_s {
char * Name;
Container_t * selectedContainer;
Container_t * textSrtContainer;
Container_t * textSsaContainer;
Container_t * assContainer;
char *Name;
Container_t *selectedContainer;
Container_t *textSrtContainer;
Container_t *textSsaContainer;
Container_t *assContainer;
int (* Command) (/*Context_t*/void *, ContainerCmd_t, void *);
int (*Command) ( /*Context_t */ void *, ContainerCmd_t, void *);
} ContainerHandler_t;
#endif

View File

@@ -8,10 +8,9 @@ static inline void Hexdump(unsigned char *Data, int length)
{
int k;
for (k = 0; k < length; k++)
{
for (k = 0; k < length; k++) {
printf("%02x ", Data[k]);
if (((k+1)&31)==0)
if (((k + 1) & 31) == 0)
printf("\n");
}
printf("\n");

View File

@@ -11,8 +11,7 @@
/* metatdata map list:
*/
char* metadata_map[] =
{
char *metadata_map[] = {
/* our tags ffmpeg tag / id3v2 */
"Title", "TIT2",
"Title", "TT2",

View File

@@ -22,14 +22,14 @@ typedef enum {
} eTrackTypeEplayer;
typedef struct Track_s {
char * Name;
char * Encoding;
char *Name;
char *Encoding;
int Id;
/* new field for ffmpeg - add at the end so no problem
* can occur with not changed srt saa container
*/
char* language;
char *language;
/* length of track */
long long int duration;
@@ -44,12 +44,12 @@ typedef struct Track_s {
int height;
/* stream from ffmpeg */
void * stream;
void *stream;
/* codec extra data (header or some other stuff) */
void * extraData;
void *extraData;
int extraSize;
uint8_t* aacbuf;
uint8_t *aacbuf;
unsigned int aacbuflen;
int have_aacheader;
@@ -62,22 +62,22 @@ typedef struct Track_s {
} Track_t;
typedef struct Manager_s {
char * Name;
int (* Command) (/*Context_t*/void *, ManagerCmd_t, void *);
char ** Capabilities;
char *Name;
int (*Command) ( /*Context_t */ void *, ManagerCmd_t, void *);
char **Capabilities;
} Manager_t;
typedef struct ManagerHandler_s {
char * Name;
Manager_t * audio;
Manager_t * video;
Manager_t * subtitle;
Manager_t * dvbsubtitle;
Manager_t * teletext;
char *Name;
Manager_t *audio;
Manager_t *video;
Manager_t *subtitle;
Manager_t *dvbsubtitle;
Manager_t *teletext;
} ManagerHandler_t;
void freeTrack(Track_t* track);
void copyTrack(Track_t* to, Track_t* from);
void freeTrack(Track_t * track);
void copyTrack(Track_t * to, Track_t * from);
#endif

View File

@@ -9,9 +9,8 @@
/* Types */
/* ***************************** */
typedef struct BitPacker_s
{
unsigned char* Ptr; /* write pointer */
typedef struct BitPacker_s {
unsigned char *Ptr; /* write pointer */
unsigned int BitBuffer; /* bitreader shifter */
int Remaining; /* number of remaining in the shifter */
} BitPacker_t;
@@ -37,7 +36,7 @@ void FlushBits(BitPacker_t * ld);
/* MISC Functions */
/* ***************************** */
static inline char *getExtension(char * name)
static inline char *getExtension(char *name)
{
if (name) {
char *ext = strrchr(name, '.');
@@ -48,34 +47,32 @@ static inline char *getExtension(char * name)
}
/* the function returns the base name */
static inline char * basename(char * name)
static inline char *basename(char *name)
{
int i = 0;
int pos = 0;
while(name[i] != 0)
{
if(name[i] == '/')
while (name[i] != 0) {
if (name[i] == '/')
pos = i;
i++;
}
if(name[pos] == '/')
if (name[pos] == '/')
pos++;
return name + pos;
}
/* the function returns the directry name */
static inline char * dirname(char * name)
static inline char *dirname(char *name)
{
static char path[100];
unsigned int i = 0;
int pos = 0;
while((name[i] != 0) && (i < sizeof(path)))
{
if(name[i] == '/')
while ((name[i] != 0) && (i < sizeof(path))) {
if (name[i] == '/')
pos = i;
path[i] = name[i];
i++;

View File

@@ -32,12 +32,11 @@ typedef enum {
OUTPUT_SET_SUBTITLE_OUTPUT
} OutputCmd_t;
typedef struct
{
unsigned char* data;
typedef struct {
unsigned char *data;
unsigned int len;
unsigned char* extradata;
unsigned char *extradata;
unsigned int extralen;
unsigned long long int pts;
@@ -48,14 +47,14 @@ typedef struct
unsigned int width;
unsigned int height;
char* type;
char *type;
} AudioVideoOut_t;
typedef struct Output_s {
char * Name;
int (* Command) (/*Context_t*/void *, OutputCmd_t, void *);
int (* Write) (/*Context_t*/void *, void* privateData);
char ** Capabilities;
char *Name;
int (*Command) ( /*Context_t */ void *, OutputCmd_t, void *);
int (*Write) ( /*Context_t */ void *, void *privateData);
char **Capabilities;
} Output_t;
@@ -64,13 +63,13 @@ extern Output_t SubtitleOutput;
extern Output_t PipeOutput;
typedef struct OutputHandler_s {
char * Name;
Output_t * audio;
Output_t * video;
Output_t * subtitle;
Output_t * dvbsubtitle;
Output_t * teletext;
int (* Command) (/*Context_t*/void *, OutputCmd_t, void *);
char *Name;
Output_t *audio;
Output_t *video;
Output_t *subtitle;
Output_t *dvbsubtitle;
Output_t *teletext;
int (*Command) ( /*Context_t */ void *, OutputCmd_t, void *);
} OutputHandler_t;
#endif

View File

@@ -20,8 +20,7 @@
#ifndef pcm_h_
#define pcm_h_
typedef struct pcmPrivateData_s
{
typedef struct pcmPrivateData_s {
int uNoOfChannels;
int uSampleRate;
int uBitsPerSample;

View File

@@ -26,7 +26,8 @@
#define VC1_VIDEO_PES_START_CODE 0xfd
#define AAC_AUDIO_PES_START_CODE 0xcf
int InsertPesHeader (unsigned char *data, int size, unsigned char stream_id, unsigned long long int pts, int pic_start_code);
int InsertPesHeader(unsigned char *data, int size, unsigned char stream_id,
unsigned long long int pts, int pic_start_code);
int InsertVideoPrivateDataHeader(unsigned char *data, int payload_size);
#endif

View File

@@ -2,10 +2,18 @@
#define PLAYBACK_H_
#include <sys/types.h>
typedef enum {PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP, PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM, PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS, PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO, PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT, PLAYBACK_SWITCH_TELETEXT, PLAYBACK_SWITCH_DVBSUBTITLE, PLAYBACK_FRAMEBUFFER_LOCK, PLAYBACK_FRAMEBUFFER_UNLOCK} PlaybackCmd_t;
typedef enum { PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP,
PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM,
PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS,
PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO,
PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION,
PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT,
PLAYBACK_SWITCH_TELETEXT, PLAYBACK_SWITCH_DVBSUBTITLE,
PLAYBACK_FRAMEBUFFER_LOCK,
PLAYBACK_FRAMEBUFFER_UNLOCK } PlaybackCmd_t;
typedef struct PlaybackHandler_s {
char * Name;
char *Name;
int fd;
@@ -31,8 +39,8 @@ typedef struct PlaybackHandler_s {
unsigned char mayWriteToFramebuffer;
unsigned char abortRequested;
int (* Command) (/*Context_t*/void *, PlaybackCmd_t, void *);
char * uri;
int (*Command) ( /*Context_t */ void *, PlaybackCmd_t, void *);
char *uri;
unsigned char noprobe; /* hack: only minimal probing in av_find_stream_info */
unsigned long long readCount;
} PlaybackHandler_t;

View File

@@ -33,52 +33,58 @@ Style: Default,Arial,64,16777215,0,16777215,0,0,0,2,2,2,2,20,20,10,0\n\n\
[Events]\n\
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n\n\n"
static inline unsigned char* text_to_ass(char *text, long long int pts, double duration)
static inline unsigned char *text_to_ass(char *text, long long int pts,
double duration)
{
char buf[1024];
unsigned int x,pos=0;
for(x=0;x<strlen(text);x++){
if(text[x]=='\n'){
buf[pos++]='\\';
buf[pos++]='N';
}else if(text[x]!='\r')buf[pos++]=text[x];
unsigned int x, pos = 0;
for (x = 0; x < strlen(text); x++) {
if (text[x] == '\n') {
buf[pos++] = '\\';
buf[pos++] = 'N';
} else if (text[x] != '\r')
buf[pos++] = text[x];
}
buf[pos++]='\0';
buf[pos++] = '\0';
int len = 80 + strlen(buf);
long long int end_pts = pts + (duration * 1000.0);
char* line = (char*)malloc( sizeof(char) * len );
char *line = (char *) malloc(sizeof(char) * len);
int sc = pts / 10;
int ec = end_pts / 10;
int sh, sm, ss, eh, em, es;
sh = sc/360000; sc -= 360000*sh;
sm = sc/ 6000; sc -= 6000*sm;
ss = sc/ 100; sc -= 100*ss;
eh = ec/360000; ec -= 360000*eh;
em = ec/ 6000; ec -= 6000*em;
es = ec/ 100; ec -= 100*es;
snprintf(line,len,"Dialogue: Marked=0,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,Default,NTP,0000,0000,0000,!Effect,%s\n",
sh = sc / 360000;
sc -= 360000 * sh;
sm = sc / 6000;
sc -= 6000 * sm;
ss = sc / 100;
sc -= 100 * ss;
eh = ec / 360000;
ec -= 360000 * eh;
em = ec / 6000;
ec -= 6000 * em;
es = ec / 100;
ec -= 100 * es;
snprintf(line, len,
"Dialogue: Marked=0,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,Default,NTP,0000,0000,0000,!Effect,%s\n",
sh, sm, ss, sc, eh, em, es, ec, buf);
return (unsigned char*)line;
return (unsigned char *) line;
}
typedef enum
{
typedef enum {
eSub_Gfx,
eSub_Txt
} SubType_t;
typedef struct
{
unsigned char* data;
typedef struct {
unsigned char *data;
int len;
} SubText_t;
typedef struct
{
unsigned char* data;
typedef struct {
unsigned char *data;
unsigned int Width;
unsigned int Height;
unsigned int Stride;
@@ -87,39 +93,35 @@ typedef struct
unsigned int color;
} SubGfx_t;
typedef struct
{
typedef struct {
SubType_t type;
long long int pts;
float duration;
union
{
union {
SubText_t text;
SubGfx_t gfx;
} u;
} SubtitleOut_t;
typedef struct
{
unsigned char* data;
typedef struct {
unsigned char *data;
int len;
unsigned char* extradata;
unsigned char *extradata;
int extralen;
long long int pts;
float duration;
} SubtitleData_t;
typedef struct
{
typedef struct {
uint32_t *destination;
unsigned int screen_width;
unsigned int screen_height;
unsigned int destStride;
void (*framebufferBlit)(void);
void (*framebufferBlit) (void);
} SubtitleOutputDef_t;
#endif

View File

@@ -4,14 +4,14 @@
#include <stdio.h>
#include <stdint.h>
typedef enum { eNone, eAudio, eVideo, eGfx} eWriterType_t;
typedef enum { eNone, eAudio, eVideo, eGfx } eWriterType_t;
typedef struct {
int fd;
unsigned char* data;
unsigned char *data;
unsigned int len;
unsigned long long int Pts;
unsigned char* private_data;
unsigned char *private_data;
unsigned int private_size;
unsigned int FrameRate;
unsigned int FrameScale;
@@ -21,7 +21,7 @@ typedef struct {
} WriterAVCallData_t;
typedef struct {
unsigned char* data;
unsigned char *data;
unsigned int Width;
unsigned int Height;
unsigned int Stride;
@@ -39,17 +39,17 @@ typedef struct {
} WriterFBCallData_t;
typedef struct WriterCaps_s {
char* name;
char *name;
eWriterType_t type;
char* textEncoding;
char *textEncoding;
/* fixme: revise if this is an enum! */
int dvbEncoding;
} WriterCaps_t;
typedef struct Writer_s {
int (* reset) ();
int (* writeData) (void*);
int (* writeReverseData) (void*);
int (*reset) ();
int (*writeData) (void *);
int (*writeReverseData) (void *);
WriterCaps_t *caps;
} Writer_t;
@@ -79,10 +79,10 @@ extern Writer_t WriterFramebuffer;
extern Writer_t WriterPipe;
extern Writer_t WriterDVBSubtitle;
Writer_t* getWriter(char* encoding);
Writer_t *getWriter(char *encoding);
Writer_t* getDefaultVideoWriter();
Writer_t* getDefaultAudioWriter();
Writer_t* getDefaultFramebufferWriter();
Writer_t *getDefaultVideoWriter();
Writer_t *getDefaultAudioWriter();
Writer_t *getDefaultFramebufferWriter();
#endif

View File

@@ -65,7 +65,7 @@ static const char FILENAME[] = "audio.c";
/* Varaibles */
/* ***************************** */
static Track_t * Tracks = NULL;
static Track_t *Tracks = NULL;
static int TrackCount = 0;
static int CurrentTrack = 0; //TRACK[0] as default.
@@ -77,9 +77,12 @@ static int CurrentTrack = 0; //TRACK[0] as default.
/* Functions */
/* ***************************** */
static int ManagerAdd(Context_t *context, Track_t track) {
static int ManagerAdd(Context_t * context, Track_t track)
{
audio_mgr_printf(10, "%s::%s name=\"%s\" encoding=\"%s\" id=%d\n", FILENAME, __FUNCTION__, track.Name, track.Encoding, track.Id);
audio_mgr_printf(10, "%s::%s name=\"%s\" encoding=\"%s\" id=%d\n",
FILENAME, __FUNCTION__, track.Name, track.Encoding,
track.Id);
if (Tracks == NULL) {
Tracks = malloc(sizeof(Track_t) * TRACKWRAP);
@@ -88,8 +91,7 @@ static int ManagerAdd(Context_t *context, Track_t track) {
Tracks[i].Id = -1;
}
if (Tracks == NULL)
{
if (Tracks == NULL) {
audio_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
return cERR_AUDIO_MGR_ERROR;
}
@@ -106,7 +108,8 @@ static int ManagerAdd(Context_t *context, Track_t track) {
copyTrack(&Tracks[TrackCount], &track);
TrackCount++;
} else {
audio_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
audio_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME,
__FUNCTION__, TrackCount, TRACKWRAP);
return cERR_AUDIO_MGR_ERROR;
}
@@ -118,54 +121,56 @@ static int ManagerAdd(Context_t *context, Track_t track) {
return cERR_AUDIO_MGR_NO_ERROR;
}
static char ** ManagerList(Context_t *context __attribute__((unused))) {
static char **ManagerList(Context_t * context __attribute__ ((unused)))
{
int i = 0, j = 0;
char ** tracklist = NULL;
char **tracklist = NULL;
audio_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (Tracks != NULL) {
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
if (tracklist == NULL)
{
if (tracklist == NULL) {
audio_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
return NULL;
}
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
if (Tracks[i].pending)
continue;
size_t len = strlen(Tracks[i].Name) + 20;
char tmp[len];
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
tracklist[j] = strdup(tmp);
tracklist[j+1] = strdup(Tracks[i].Encoding);
tracklist[j + 1] = strdup(Tracks[i].Encoding);
}
tracklist[j] = NULL;
}
audio_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount);
audio_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME,
__FUNCTION__, tracklist, j, TrackCount);
return tracklist;
}
static int ManagerDel(Context_t * context) {
static int ManagerDel(Context_t * context)
{
int i = 0;
audio_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
freeTrack(&Tracks[i]);
}
free(Tracks);
Tracks = NULL;
} else
{
audio_mgr_err("%s::%s nothing to delete!\n", FILENAME, __FUNCTION__);
} else {
audio_mgr_err("%s::%s nothing to delete!\n", FILENAME,
__FUNCTION__);
return cERR_AUDIO_MGR_ERROR;
}
@@ -173,95 +178,107 @@ static int ManagerDel(Context_t * context) {
CurrentTrack = 0;
context->playback->isAudio = 0;
audio_mgr_printf(10, "%s::%s return no error\n", FILENAME, __FUNCTION__);
audio_mgr_printf(10, "%s::%s return no error\n", FILENAME,
__FUNCTION__);
return cERR_AUDIO_MGR_NO_ERROR;
}
static int Command(void *_context, ManagerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ManagerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_AUDIO_MGR_NO_ERROR;
audio_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
switch(command) {
case MANAGER_ADD: {
Track_t * track = argument;
switch (command) {
case MANAGER_ADD:{
Track_t *track = argument;
ret = ManagerAdd(context, *track);
break;
}
case MANAGER_LIST: {
container_ffmpeg_update_tracks(context, context->playback->uri, 0);
*((char***)argument) = (char **)ManagerList(context);
case MANAGER_LIST:{
container_ffmpeg_update_tracks(context, context->playback->uri,
0);
*((char ***) argument) = (char **) ManagerList(context);
break;
}
case MANAGER_GET: {
audio_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME, __FUNCTION__);
case MANAGER_GET:{
audio_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME,
__FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((int*)argument) = (int)Tracks[CurrentTrack].Id;
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((int *) argument) = (int) Tracks[CurrentTrack].Id;
else
*((int*)argument) = (int)-1;
*((int *) argument) = (int) -1;
break;
}
case MANAGER_GET_TRACK: {
audio_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__);
case MANAGER_GET_TRACK:{
audio_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME,
__FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((Track_t**)argument) = (Track_t*) &Tracks[CurrentTrack];
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((Track_t **) argument) =
(Track_t *) & Tracks[CurrentTrack];
else
*((Track_t**)argument) = NULL;
*((Track_t **) argument) = NULL;
break;
}
case MANAGER_GETENCODING: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Encoding);
case MANAGER_GETENCODING:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Encoding);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_GETNAME: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Name);
case MANAGER_GETNAME:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Name);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_SET: {
case MANAGER_SET:{
int i;
audio_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME, __FUNCTION__, *((int*)argument));
audio_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME,
__FUNCTION__, *((int *) argument));
for (i = 0; i < TrackCount; i++)
if (Tracks[i].Id == *((int*)argument)) {
if (Tracks[i].Id == *((int *) argument)) {
CurrentTrack = i;
break;
}
if (i == TrackCount) {
audio_mgr_err("%s::%s track id %d unknown\n", FILENAME, __FUNCTION__, *((int*)argument));
audio_mgr_err("%s::%s track id %d unknown\n", FILENAME,
__FUNCTION__, *((int *) argument));
ret = cERR_AUDIO_MGR_ERROR;
}
break;
}
case MANAGER_DEL: {
case MANAGER_DEL:{
ret = ManagerDel(context);
break;
}
case MANAGER_INIT_UPDATE: {
case MANAGER_INIT_UPDATE:{
int i;
for (i = 0; i < TrackCount; i++)
Tracks[i].pending = 1;
break;
}
default:
audio_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
audio_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME,
__FUNCTION__, command);
ret = cERR_AUDIO_MGR_ERROR;
break;
}
audio_mgr_printf(10, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,ret);
audio_mgr_printf(10, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,
ret);
return ret;
}

View File

@@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__;
/* Varaibles */
/* ***************************** */
static Track_t * Tracks = NULL;
static Track_t *Tracks = NULL;
static int TrackCount = 0;
static int CurrentTrack = -1;
@@ -77,9 +77,13 @@ static int CurrentTrack = -1;
/* Functions */
/* ***************************** */
static int ManagerAdd(Context_t *context, Track_t track) {
static int ManagerAdd(Context_t * context, Track_t track)
{
dvbsubtitle_mgr_printf(10, "%s::%s name=\"%s\" encoding=\"%s\" id=%d\n", FILENAME, __FUNCTION__, track.Name, track.Encoding, track.Id);
dvbsubtitle_mgr_printf(10,
"%s::%s name=\"%s\" encoding=\"%s\" id=%d\n",
FILENAME, __FUNCTION__, track.Name,
track.Encoding, track.Id);
if (Tracks == NULL) {
Tracks = malloc(sizeof(Track_t) * TRACKWRAP);
@@ -88,9 +92,9 @@ static int ManagerAdd(Context_t *context, Track_t track) {
Tracks[i].Id = -1;
}
if (Tracks == NULL)
{
dvbsubtitle_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
if (Tracks == NULL) {
dvbsubtitle_mgr_err("%s:%s malloc failed\n", FILENAME,
__FUNCTION__);
return cERR_DVBSUBTITLE_MGR_ERROR;
}
@@ -106,7 +110,8 @@ static int ManagerAdd(Context_t *context, Track_t track) {
copyTrack(&Tracks[TrackCount], &track);
TrackCount++;
} else {
dvbsubtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
dvbsubtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n",
FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
return cERR_DVBSUBTITLE_MGR_ERROR;
}
@@ -118,54 +123,57 @@ static int ManagerAdd(Context_t *context, Track_t track) {
return cERR_DVBSUBTITLE_MGR_NO_ERROR;
}
static char ** ManagerList(Context_t *context __attribute__((unused))) {
static char **ManagerList(Context_t * context __attribute__ ((unused)))
{
int i = 0, j = 0;
char ** tracklist = NULL;
char **tracklist = NULL;
dvbsubtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (Tracks != NULL) {
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
if (tracklist == NULL)
{
dvbsubtitle_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
if (tracklist == NULL) {
dvbsubtitle_mgr_err("%s:%s malloc failed\n", FILENAME,
__FUNCTION__);
return NULL;
}
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
if (Tracks[i].pending)
continue;
size_t len = strlen(Tracks[i].Name) + 20;
char tmp[len];
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
tracklist[j] = strdup(tmp);
tracklist[j+1] = strdup(Tracks[i].Encoding);
tracklist[j + 1] = strdup(Tracks[i].Encoding);
}
tracklist[j] = NULL;
}
dvbsubtitle_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount);
dvbsubtitle_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME,
__FUNCTION__, tracklist, j, TrackCount);
return tracklist;
}
static int ManagerDel(Context_t * context) {
static int ManagerDel(Context_t * context)
{
int i = 0;
dvbsubtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
freeTrack(&Tracks[i]);
}
free(Tracks);
Tracks = NULL;
} else
{
dvbsubtitle_mgr_err("%s::%s nothing to delete!\n", FILENAME, __FUNCTION__);
} else {
dvbsubtitle_mgr_err("%s::%s nothing to delete!\n", FILENAME,
__FUNCTION__);
return cERR_DVBSUBTITLE_MGR_ERROR;
}
@@ -173,95 +181,109 @@ static int ManagerDel(Context_t * context) {
CurrentTrack = -1;
context->playback->isDvbSubtitle = 0;
dvbsubtitle_mgr_printf(10, "%s::%s return no error\n", FILENAME, __FUNCTION__);
dvbsubtitle_mgr_printf(10, "%s::%s return no error\n", FILENAME,
__FUNCTION__);
return cERR_DVBSUBTITLE_MGR_NO_ERROR;
}
static int Command(void *_context, ManagerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ManagerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_DVBSUBTITLE_MGR_NO_ERROR;
dvbsubtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
switch(command) {
case MANAGER_ADD: {
Track_t * track = argument;
switch (command) {
case MANAGER_ADD:{
Track_t *track = argument;
ret = ManagerAdd(context, *track);
break;
}
case MANAGER_LIST: {
container_ffmpeg_update_tracks(context, context->playback->uri, 0);
*((char***)argument) = (char **)ManagerList(context);
case MANAGER_LIST:{
container_ffmpeg_update_tracks(context, context->playback->uri,
0);
*((char ***) argument) = (char **) ManagerList(context);
break;
}
case MANAGER_GET: {
dvbsubtitle_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME, __FUNCTION__);
case MANAGER_GET:{
dvbsubtitle_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME,
__FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((int*)argument) = (int)Tracks[CurrentTrack].Id;
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((int *) argument) = (int) Tracks[CurrentTrack].Id;
else
*((int*)argument) = (int)-1;
*((int *) argument) = (int) -1;
break;
}
case MANAGER_GET_TRACK: {
dvbsubtitle_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__);
case MANAGER_GET_TRACK:{
dvbsubtitle_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n",
FILENAME, __FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((Track_t**)argument) = (Track_t*) &Tracks[CurrentTrack];
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((Track_t **) argument) =
(Track_t *) & Tracks[CurrentTrack];
else
*((Track_t**)argument) = NULL;
*((Track_t **) argument) = NULL;
break;
}
case MANAGER_GETENCODING: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Encoding);
case MANAGER_GETENCODING:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Encoding);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_GETNAME: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Name);
case MANAGER_GETNAME:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Name);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_SET: {
case MANAGER_SET:{
int i;
dvbsubtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME, __FUNCTION__, *((int*)argument));
dvbsubtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n",
FILENAME, __FUNCTION__,
*((int *) argument));
for (i = 0; i < TrackCount; i++)
if (Tracks[i].Id == *((int*)argument)) {
if (Tracks[i].Id == *((int *) argument)) {
CurrentTrack = i;
break;
}
if (i == TrackCount) {
dvbsubtitle_mgr_err("%s::%s track id %d unknown\n", FILENAME, __FUNCTION__, *((int*)argument));
dvbsubtitle_mgr_err("%s::%s track id %d unknown\n",
FILENAME, __FUNCTION__,
*((int *) argument));
ret = cERR_DVBSUBTITLE_MGR_ERROR;
}
break;
}
case MANAGER_DEL: {
case MANAGER_DEL:{
ret = ManagerDel(context);
break;
}
case MANAGER_INIT_UPDATE: {
case MANAGER_INIT_UPDATE:{
int i;
for (i = 0; i < TrackCount; i++)
Tracks[i].pending = 1;
break;
}
default:
dvbsubtitle_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
dvbsubtitle_mgr_err("%s::%s ContainerCmd %d not supported!\n",
FILENAME, __FUNCTION__, command);
ret = cERR_DVBSUBTITLE_MGR_ERROR;
break;
}
dvbsubtitle_mgr_printf(10, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,ret);
dvbsubtitle_mgr_printf(10, "%s:%s: returning %d\n", FILENAME,
__FUNCTION__, ret);
return ret;
}

View File

@@ -47,9 +47,7 @@ ManagerHandler_t ManagerHandler = {
"ManagerHandler",
&AudioManager,
&VideoManager,
&SubtitleManager
, &DvbSubtitleManager
, &TeletextManager
&SubtitleManager, &DvbSubtitleManager, &TeletextManager
};
/* ***************************** */
@@ -59,7 +57,7 @@ ManagerHandler_t ManagerHandler = {
/* ***************************** */
/* Functions */
/* ***************************** */
void copyTrack(Track_t* to, Track_t* from)
void copyTrack(Track_t * to, Track_t * from)
{
*to = *from;
@@ -79,7 +77,7 @@ void copyTrack(Track_t* to, Track_t* from)
to->language = strdup("Unknown");
}
void freeTrack(Track_t* track)
void freeTrack(Track_t * track)
{
if (track->Name != NULL)
free(track->Name);

View File

@@ -64,7 +64,7 @@ static const char FILENAME[] = "subtitle.c";
/* Varaibles */
/* ***************************** */
static Track_t * Tracks = NULL;
static Track_t *Tracks = NULL;
static int TrackCount = 0;
static int CurrentTrack = -1; //no as default.
@@ -76,9 +76,11 @@ static int CurrentTrack = -1; //no as default.
/* Functions */
/* ***************************** */
static int ManagerAdd(Context_t *context, Track_t track) {
static int ManagerAdd(Context_t * context, Track_t track)
{
subtitle_mgr_printf(10, "%s::%s %s %s %d\n", FILENAME, __FUNCTION__, track.Name, track.Encoding, track.Id);
subtitle_mgr_printf(10, "%s::%s %s %s %d\n", FILENAME, __FUNCTION__,
track.Name, track.Encoding, track.Id);
if (Tracks == NULL) {
Tracks = malloc(sizeof(Track_t) * TRACKWRAP);
@@ -87,8 +89,7 @@ static int ManagerAdd(Context_t *context, Track_t track) {
Tracks[i].Id = -1;
}
if (Tracks == NULL)
{
if (Tracks == NULL) {
subtitle_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
return cERR_SUBTITLE_MGR_ERROR;
}
@@ -106,7 +107,8 @@ static int ManagerAdd(Context_t *context, Track_t track) {
TrackCount++;
} else {
subtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
subtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n",
FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
return cERR_SUBTITLE_MGR_ERROR;
}
@@ -118,55 +120,58 @@ static int ManagerAdd(Context_t *context, Track_t track) {
return cERR_SUBTITLE_MGR_NO_ERROR;
}
static char ** ManagerList(Context_t *context __attribute__((unused))) {
char ** tracklist = NULL;
static char **ManagerList(Context_t * context __attribute__ ((unused)))
{
char **tracklist = NULL;
int i = 0, j = 0;
subtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (Tracks != NULL) {
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
if (tracklist == NULL)
{
subtitle_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
if (tracklist == NULL) {
subtitle_mgr_err("%s:%s malloc failed\n", FILENAME,
__FUNCTION__);
return NULL;
}
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
if (Tracks[i].pending)
continue;
size_t len = strlen(Tracks[i].Name) + 20;
char tmp[len];
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
tracklist[j] = strdup(tmp);
tracklist[j+1] = strdup(Tracks[i].Encoding);
tracklist[j + 1] = strdup(Tracks[i].Encoding);
}
tracklist[j] = NULL;
}
subtitle_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount);
subtitle_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME,
__FUNCTION__, tracklist, j, TrackCount);
return tracklist;
}
static int ManagerDel(Context_t * context) {
static int ManagerDel(Context_t * context)
{
int i = 0;
subtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
freeTrack(&Tracks[i]);
}
free(Tracks);
Tracks = NULL;
} else
{
subtitle_mgr_err("%s::%s nothing to delete!\n", FILENAME, __FUNCTION__);
} else {
subtitle_mgr_err("%s::%s nothing to delete!\n", FILENAME,
__FUNCTION__);
return cERR_SUBTITLE_MGR_ERROR;
}
@@ -174,96 +179,105 @@ static int ManagerDel(Context_t * context) {
CurrentTrack = -1;
context->playback->isSubtitle = 0;
subtitle_mgr_printf(10, "%s::%s return no error\n", FILENAME, __FUNCTION__);
subtitle_mgr_printf(10, "%s::%s return no error\n", FILENAME,
__FUNCTION__);
return cERR_SUBTITLE_MGR_NO_ERROR;
}
static int Command(void *_context, ManagerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ManagerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_SUBTITLE_MGR_NO_ERROR;
subtitle_mgr_printf(50, "%s::%s %d\n", FILENAME, __FUNCTION__, command);
subtitle_mgr_printf(50, "%s::%s %d\n", FILENAME, __FUNCTION__,
command);
switch(command) {
case MANAGER_ADD: {
Track_t * track = argument;
switch (command) {
case MANAGER_ADD:{
Track_t *track = argument;
ret = ManagerAdd(context, *track);
break;
}
case MANAGER_LIST: {
container_ffmpeg_update_tracks(context, context->playback->uri, 0);
*((char***)argument) = (char **)ManagerList(context);
case MANAGER_LIST:{
container_ffmpeg_update_tracks(context, context->playback->uri,
0);
*((char ***) argument) = (char **) ManagerList(context);
break;
}
case MANAGER_GET: {
case MANAGER_GET:{
if (TrackCount > 0 && CurrentTrack >= 0)
*((int*)argument) = (int)Tracks[CurrentTrack].Id;
*((int *) argument) = (int) Tracks[CurrentTrack].Id;
else
*((int*)argument) = (int)-1;
*((int *) argument) = (int) -1;
break;
}
case MANAGER_GET_TRACK: {
case MANAGER_GET_TRACK:{
//subtitle_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
{
subtitle_mgr_printf(120, "return %d, %p\n", CurrentTrack, &Tracks[CurrentTrack]);
*((Track_t**)argument) = (Track_t*) &Tracks[CurrentTrack];
}
else
{
if ((TrackCount > 0) && (CurrentTrack >= 0)) {
subtitle_mgr_printf(120, "return %d, %p\n", CurrentTrack,
&Tracks[CurrentTrack]);
*((Track_t **) argument) =
(Track_t *) & Tracks[CurrentTrack];
} else {
subtitle_mgr_printf(20, "return NULL\n");
*((Track_t**)argument) = NULL;
*((Track_t **) argument) = NULL;
}
break;
}
case MANAGER_GETENCODING: {
case MANAGER_GETENCODING:{
if (TrackCount > 0 && CurrentTrack >= 0)
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Encoding);
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Encoding);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_GETNAME: {
case MANAGER_GETNAME:{
if (TrackCount > 0 && CurrentTrack >= 0)
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Name);
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Name);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_SET: {
case MANAGER_SET:{
int i;
subtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME, __FUNCTION__, *((int*)argument));
subtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME,
__FUNCTION__, *((int *) argument));
for (i = 0; i < TrackCount; i++)
if (Tracks[i].Id == *((int*)argument)) {
if (Tracks[i].Id == *((int *) argument)) {
CurrentTrack = i;
break;
}
if (i == TrackCount) {
subtitle_mgr_err("%s::%s track id %d unknown\n", FILENAME, __FUNCTION__, *((int*)argument));
subtitle_mgr_err("%s::%s track id %d unknown\n", FILENAME,
__FUNCTION__, *((int *) argument));
ret = cERR_SUBTITLE_MGR_ERROR;
}
break;
}
case MANAGER_DEL: {
case MANAGER_DEL:{
ret = ManagerDel(context);
break;
}
case MANAGER_INIT_UPDATE: {
case MANAGER_INIT_UPDATE:{
int i;
for (i = 0; i < TrackCount; i++)
Tracks[i].pending = 1;
break;
}
default:
subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME, __FUNCTION__);
subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME,
__FUNCTION__);
ret = cERR_SUBTITLE_MGR_ERROR;
break;
}
subtitle_mgr_printf(50, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,ret);
subtitle_mgr_printf(50, "%s:%s: returning %d\n", FILENAME,
__FUNCTION__, ret);
return ret;
}

View File

@@ -65,7 +65,7 @@ static const char FILENAME[] = __FILE__;
/* Varaibles */
/* ***************************** */
static Track_t * Tracks = NULL;
static Track_t *Tracks = NULL;
static int TrackCount = 0;
static int CurrentTrack = -1;
@@ -77,9 +77,12 @@ static int CurrentTrack = -1;
/* Functions */
/* ***************************** */
static int ManagerAdd(Context_t *context, Track_t track) {
static int ManagerAdd(Context_t * context, Track_t track)
{
teletext_mgr_printf(10, "%s::%s name=\"%s\" encoding=\"%s\" id=%d\n", FILENAME, __FUNCTION__, track.Name, track.Encoding, track.Id);
teletext_mgr_printf(10, "%s::%s name=\"%s\" encoding=\"%s\" id=%d\n",
FILENAME, __FUNCTION__, track.Name, track.Encoding,
track.Id);
if (Tracks == NULL) {
Tracks = malloc(sizeof(Track_t) * TRACKWRAP);
@@ -88,8 +91,7 @@ static int ManagerAdd(Context_t *context, Track_t track) {
Tracks[i].Id = -1;
}
if (Tracks == NULL)
{
if (Tracks == NULL) {
teletext_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
return cERR_TELETEXT_MGR_ERROR;
}
@@ -106,7 +108,8 @@ static int ManagerAdd(Context_t *context, Track_t track) {
copyTrack(&Tracks[TrackCount], &track);
TrackCount++;
} else {
teletext_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
teletext_mgr_err("%s:%s TrackCount out if range %d - %d\n",
FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
return cERR_TELETEXT_MGR_ERROR;
}
@@ -118,54 +121,57 @@ static int ManagerAdd(Context_t *context, Track_t track) {
return cERR_TELETEXT_MGR_NO_ERROR;
}
static char ** ManagerList(Context_t *context __attribute__((unused))) {
static char **ManagerList(Context_t * context __attribute__ ((unused)))
{
int i = 0, j = 0;
char ** tracklist = NULL;
char **tracklist = NULL;
teletext_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (Tracks != NULL) {
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
if (tracklist == NULL)
{
teletext_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
if (tracklist == NULL) {
teletext_mgr_err("%s:%s malloc failed\n", FILENAME,
__FUNCTION__);
return NULL;
}
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
if (Tracks[i].pending)
continue;
size_t len = strlen(Tracks[i].Name) + 20;
char tmp[len];
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
tracklist[j] = strdup(tmp);
tracklist[j+1] = strdup(Tracks[i].Encoding);
tracklist[j + 1] = strdup(Tracks[i].Encoding);
}
tracklist[j] = NULL;
}
teletext_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount);
teletext_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME,
__FUNCTION__, tracklist, j, TrackCount);
return tracklist;
}
static int ManagerDel(Context_t * context) {
static int ManagerDel(Context_t * context)
{
int i = 0;
teletext_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
freeTrack(&Tracks[i]);
}
free(Tracks);
Tracks = NULL;
} else
{
teletext_mgr_err("%s::%s nothing to delete!\n", FILENAME, __FUNCTION__);
} else {
teletext_mgr_err("%s::%s nothing to delete!\n", FILENAME,
__FUNCTION__);
return cERR_TELETEXT_MGR_ERROR;
}
@@ -173,95 +179,107 @@ static int ManagerDel(Context_t * context) {
CurrentTrack = -1;
context->playback->isTeletext = 0;
teletext_mgr_printf(10, "%s::%s return no error\n", FILENAME, __FUNCTION__);
teletext_mgr_printf(10, "%s::%s return no error\n", FILENAME,
__FUNCTION__);
return cERR_TELETEXT_MGR_NO_ERROR;
}
static int Command(void *_context, ManagerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ManagerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_TELETEXT_MGR_NO_ERROR;
teletext_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
switch(command) {
case MANAGER_ADD: {
Track_t * track = argument;
switch (command) {
case MANAGER_ADD:{
Track_t *track = argument;
ret = ManagerAdd(context, *track);
break;
}
case MANAGER_LIST: {
container_ffmpeg_update_tracks(context, context->playback->uri, 0);
*((char***)argument) = (char **)ManagerList(context);
case MANAGER_LIST:{
container_ffmpeg_update_tracks(context, context->playback->uri,
0);
*((char ***) argument) = (char **) ManagerList(context);
break;
}
case MANAGER_GET: {
teletext_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME, __FUNCTION__);
case MANAGER_GET:{
teletext_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME,
__FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((int*)argument) = (int)Tracks[CurrentTrack].Id;
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((int *) argument) = (int) Tracks[CurrentTrack].Id;
else
*((int*)argument) = (int)-1;
*((int *) argument) = (int) -1;
break;
}
case MANAGER_GET_TRACK: {
teletext_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__);
case MANAGER_GET_TRACK:{
teletext_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME,
__FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((Track_t**)argument) = (Track_t*) &Tracks[CurrentTrack];
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((Track_t **) argument) =
(Track_t *) & Tracks[CurrentTrack];
else
*((Track_t**)argument) = NULL;
*((Track_t **) argument) = NULL;
break;
}
case MANAGER_GETENCODING: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Encoding);
case MANAGER_GETENCODING:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Encoding);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_GETNAME: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Name);
case MANAGER_GETNAME:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Name);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_SET: {
case MANAGER_SET:{
int i;
teletext_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME, __FUNCTION__, *((int*)argument));
teletext_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME,
__FUNCTION__, *((int *) argument));
for (i = 0; i < TrackCount; i++)
if (Tracks[i].Id == *((int*)argument)) {
if (Tracks[i].Id == *((int *) argument)) {
CurrentTrack = i;
break;
}
if (i == TrackCount) {
teletext_mgr_err("%s::%s track id %d unknown\n", FILENAME, __FUNCTION__, *((int*)argument));
teletext_mgr_err("%s::%s track id %d unknown\n", FILENAME,
__FUNCTION__, *((int *) argument));
ret = cERR_TELETEXT_MGR_ERROR;
}
break;
}
case MANAGER_DEL: {
case MANAGER_DEL:{
ret = ManagerDel(context);
break;
}
case MANAGER_INIT_UPDATE: {
case MANAGER_INIT_UPDATE:{
int i;
for (i = 0; i < TrackCount; i++)
Tracks[i].pending = 1;
break;
}
default:
teletext_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
teletext_mgr_err("%s::%s ContainerCmd %d not supported!\n",
FILENAME, __FUNCTION__, command);
ret = cERR_TELETEXT_MGR_ERROR;
break;
}
teletext_mgr_printf(10, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,ret);
teletext_mgr_printf(10, "%s:%s: returning %d\n", FILENAME,
__FUNCTION__, ret);
return ret;
}

View File

@@ -64,7 +64,7 @@ static const char FILENAME[] = "video.c";
/* Varaibles */
/* ***************************** */
static Track_t * Tracks = NULL;
static Track_t *Tracks = NULL;
static int TrackCount = 0;
static int CurrentTrack = 0; //TRACK[0] as default.
@@ -76,7 +76,8 @@ static int CurrentTrack = 0; //TRACK[0] as default.
/* Functions */
/* ***************************** */
static int ManagerAdd(Context_t *context, Track_t track) {
static int ManagerAdd(Context_t * context, Track_t track)
{
video_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (Tracks == NULL) {
@@ -86,8 +87,7 @@ static int ManagerAdd(Context_t *context, Track_t track) {
Tracks[i].Id = -1;
}
if (Tracks == NULL)
{
if (Tracks == NULL) {
video_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
return cERR_VIDEO_MGR_ERROR;
}
@@ -105,7 +105,8 @@ static int ManagerAdd(Context_t *context, Track_t track) {
TrackCount++;
} else {
video_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME, __FUNCTION__, TrackCount, TRACKWRAP);
video_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME,
__FUNCTION__, TrackCount, TRACKWRAP);
return cERR_VIDEO_MGR_ERROR;
}
@@ -117,53 +118,55 @@ static int ManagerAdd(Context_t *context, Track_t track) {
return cERR_VIDEO_MGR_NO_ERROR;
}
static char ** ManagerList(Context_t *context __attribute__((unused))) {
static char **ManagerList(Context_t * context __attribute__ ((unused)))
{
int i = 0, j = 0;
char ** tracklist = NULL;
char **tracklist = NULL;
video_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (Tracks != NULL) {
tracklist = malloc(sizeof(char *) * ((TrackCount*2) + 1));
tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1));
if (tracklist == NULL)
{
if (tracklist == NULL) {
video_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__);
return NULL;
}
for (i = 0, j = 0; i < TrackCount; i++, j+=2) {
for (i = 0, j = 0; i < TrackCount; i++, j += 2) {
if (Tracks[i].pending)
continue;
size_t len = strlen(Tracks[i].Name) + 20;
char tmp[len];
snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name);
tracklist[j] = strdup(tmp);
tracklist[j+1] = strdup(Tracks[i].Encoding);
tracklist[j + 1] = strdup(Tracks[i].Encoding);
}
tracklist[j] = NULL;
}
video_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount);
video_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME,
__FUNCTION__, tracklist, j, TrackCount);
return tracklist;
}
static int ManagerDel(Context_t * context) {
static int ManagerDel(Context_t * context)
{
int i = 0;
video_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if(Tracks != NULL) {
if (Tracks != NULL) {
for (i = 0; i < TrackCount; i++) {
freeTrack(&Tracks[i]);
}
free(Tracks);
Tracks = NULL;
} else
{
video_mgr_err("%s::%s nothing to delete!\n", FILENAME, __FUNCTION__);
} else {
video_mgr_err("%s::%s nothing to delete!\n", FILENAME,
__FUNCTION__);
return cERR_VIDEO_MGR_ERROR;
}
@@ -171,91 +174,100 @@ static int ManagerDel(Context_t * context) {
CurrentTrack = 0;
context->playback->isVideo = 0;
video_mgr_printf(10, "%s::%s return no error\n", FILENAME, __FUNCTION__);
video_mgr_printf(10, "%s::%s return no error\n", FILENAME,
__FUNCTION__);
return cERR_VIDEO_MGR_NO_ERROR;
}
static int Command(void *_context, ManagerCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, ManagerCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_VIDEO_MGR_NO_ERROR;
video_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
switch(command) {
case MANAGER_ADD: {
Track_t * track = argument;
switch (command) {
case MANAGER_ADD:{
Track_t *track = argument;
ret = ManagerAdd(context, *track);
break;
}
case MANAGER_LIST: {
container_ffmpeg_update_tracks(context, context->playback->uri, 0);
*((char***)argument) = (char **)ManagerList(context);
case MANAGER_LIST:{
container_ffmpeg_update_tracks(context, context->playback->uri,
0);
*((char ***) argument) = (char **) ManagerList(context);
break;
}
case MANAGER_GET: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((int*)argument) = (int)Tracks[CurrentTrack].Id;
case MANAGER_GET:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((int *) argument) = (int) Tracks[CurrentTrack].Id;
else
*((int*)argument) = (int)-1;
*((int *) argument) = (int) -1;
break;
}
case MANAGER_GET_TRACK: {
video_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__);
case MANAGER_GET_TRACK:{
video_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME,
__FUNCTION__);
if ((TrackCount > 0) && (CurrentTrack >=0))
*((Track_t**)argument) = (Track_t*) &Tracks[CurrentTrack];
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((Track_t **) argument) =
(Track_t *) & Tracks[CurrentTrack];
else
*((Track_t**)argument) = NULL;
*((Track_t **) argument) = NULL;
break;
}
case MANAGER_GETENCODING: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Encoding);
case MANAGER_GETENCODING:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Encoding);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_GETNAME: {
if ((TrackCount > 0) && (CurrentTrack >=0))
*((char**)argument) = (char *)strdup(Tracks[CurrentTrack].Name);
case MANAGER_GETNAME:{
if ((TrackCount > 0) && (CurrentTrack >= 0))
*((char **) argument) =
(char *) strdup(Tracks[CurrentTrack].Name);
else
*((char**)argument) = (char *)strdup("");
*((char **) argument) = (char *) strdup("");
break;
}
case MANAGER_SET: {
case MANAGER_SET:{
int i;
for (i = 0; i < TrackCount; i++)
if (Tracks[i].Id == *((int*)argument)) {
if (Tracks[i].Id == *((int *) argument)) {
CurrentTrack = i;
break;
}
if (i == TrackCount)
{
video_mgr_err("%s::%s track id %d unknown\n", FILENAME, __FUNCTION__, *((int*)argument));
if (i == TrackCount) {
video_mgr_err("%s::%s track id %d unknown\n", FILENAME,
__FUNCTION__, *((int *) argument));
ret = cERR_VIDEO_MGR_ERROR;
}
break;
}
case MANAGER_DEL: {
case MANAGER_DEL:{
ret = ManagerDel(context);
break;
}
case MANAGER_INIT_UPDATE: {
case MANAGER_INIT_UPDATE:{
int i;
for (i = 0; i < TrackCount; i++)
Tracks[i].pending = 1;
break;
}
default:
video_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
video_mgr_err("%s::%s ContainerCmd %d not supported!\n", FILENAME,
__FUNCTION__, command);
ret = cERR_VIDEO_MGR_ERROR;
break;
}
video_mgr_printf(10, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,ret);
video_mgr_printf(10, "%s:%s: returning %d\n", FILENAME, __FUNCTION__,
ret);
return ret;
}

File diff suppressed because it is too large Load Diff

View File

@@ -53,7 +53,7 @@ if (debug_level >= level) fprintf(stderr, x); } while (0)
#define cERR_OUTPUT_NO_ERROR 0
#define cERR_OUTPUT_INTERNAL_ERROR -1
static const char* FILENAME = "output.c";
static const char *FILENAME = "output.c";
/* ***************************** */
/* Types */
@@ -63,7 +63,7 @@ static const char* FILENAME = "output.c";
/* Varaibles */
/* ***************************** */
static Output_t * AvailableOutput[] = {
static Output_t *AvailableOutput[] = {
&LinuxDvbOutput,
&SubtitleOutput,
&PipeOutput,
@@ -78,7 +78,8 @@ static Output_t * AvailableOutput[] = {
/* MISC Functions */
/* ***************************** */
static void printOutputCapabilities() {
static void printOutputCapabilities()
{
int i, j;
output_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
@@ -97,7 +98,8 @@ static void printOutputCapabilities() {
/* Output Functions */
/* ***************************** */
static void OutputAdd(Context_t *context, char * port) {
static void OutputAdd(Context_t * context, char *port)
{
int i, j;
output_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
@@ -128,7 +130,8 @@ static void OutputAdd(Context_t *context, char * port) {
}
}
static void OutputDel(Context_t *context, char * port) {
static void OutputDel(Context_t * context, char *port)
{
output_printf(10, "%s::%s\n", FILENAME, __FUNCTION__);
if (!strcmp("audio", port))
@@ -144,241 +147,387 @@ static void OutputDel(Context_t *context, char * port) {
}
static int Command(void *_context, OutputCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, OutputCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_OUTPUT_NO_ERROR;
output_printf(10, "%s::%s Command %d\n", FILENAME, __FUNCTION__, command);
output_printf(10, "%s::%s Command %d\n", FILENAME, __FUNCTION__,
command);
switch(command) {
case OUTPUT_OPEN: {
if (context && context->playback ) {
switch (command) {
case OUTPUT_OPEN:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_OPEN, "video");
ret |=
context->output->video->Command(context,
OUTPUT_OPEN,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_OPEN, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_OPEN,
"audio");
if (context->playback->isSubtitle)
ret |= context->output->subtitle->Command(context, OUTPUT_OPEN, "subtitle");
ret |=
context->output->subtitle->Command(context,
OUTPUT_OPEN,
"subtitle");
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_CLOSE: {
if (context && context->playback ) {
case OUTPUT_CLOSE:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_CLOSE, "video");
ret |=
context->output->video->Command(context,
OUTPUT_CLOSE,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_CLOSE, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_CLOSE,
"audio");
if (context->playback->isSubtitle)
ret |= context->output->subtitle->Command(context, OUTPUT_CLOSE, "subtitle");
ret |=
context->output->subtitle->Command(context,
OUTPUT_CLOSE,
"subtitle");
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_ADD: {
OutputAdd(context, (char*) argument);
case OUTPUT_ADD:{
OutputAdd(context, (char *) argument);
break;
}
case OUTPUT_DEL: {
OutputDel(context, (char*) argument);
case OUTPUT_DEL:{
OutputDel(context, (char *) argument);
break;
}
case OUTPUT_CAPABILITIES: {
case OUTPUT_CAPABILITIES:{
printOutputCapabilities();
break;
}
case OUTPUT_PLAY: { // 4
if (context && context->playback ) {
case OUTPUT_PLAY:{ // 4
if (context && context->playback) {
if (context->playback->isVideo)
ret = context->output->video->Command(context, OUTPUT_PLAY, "video");
ret =
context->output->video->Command(context,
OUTPUT_PLAY,
"video");
if (!ret) { // success or not executed, dunn care
if (context->playback->isAudio)
ret = context->output->audio->Command(context, OUTPUT_PLAY, "audio");
ret =
context->output->audio->Command(context,
OUTPUT_PLAY,
"audio");
if (!ret) { // success or not executed, dunn care
if (context->playback->isSubtitle)
ret = context->output->subtitle->Command(context, OUTPUT_PLAY, "subtitle");
ret =
context->output->subtitle->Command(context,
OUTPUT_PLAY,
"subtitle");
}
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
}
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_STOP: {
if (context && context->playback ) {
case OUTPUT_STOP:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_STOP, "video");
ret |=
context->output->video->Command(context,
OUTPUT_STOP,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_STOP, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_STOP,
"audio");
if (context->playback->isSubtitle)
ret |= context->output->subtitle->Command(context, OUTPUT_STOP, "subtitle");
ret |=
context->output->subtitle->Command(context,
OUTPUT_STOP,
"subtitle");
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_FLUSH: {
if (context && context->playback ) {
case OUTPUT_FLUSH:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_FLUSH, "video");
ret |=
context->output->video->Command(context,
OUTPUT_FLUSH,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_FLUSH, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_FLUSH,
"audio");
//if (context->playback->isSubtitle)
// ret |= context->output->subtitle->Command(context, OUTPUT_FLUSH, "subtitle");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_PAUSE: {
if (context && context->playback ) {
case OUTPUT_PAUSE:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_PAUSE, "video");
ret |=
context->output->video->Command(context,
OUTPUT_PAUSE,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_PAUSE, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_PAUSE,
"audio");
//if (context->playback->isSubtitle)
// ret |= context->output->subtitle->Command(context, OUTPUT_PAUSE, "subtitle");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_FASTFORWARD: {
if (context && context->playback ) {
case OUTPUT_FASTFORWARD:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_FASTFORWARD, "video");
ret |=
context->output->video->Command(context,
OUTPUT_FASTFORWARD,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_FASTFORWARD, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_FASTFORWARD,
"audio");
//if (context->playback->isSubtitle)
// ret |= context->output->subtitle->Command(context, OUTPUT_PAUSE, "subtitle");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_REVERSE: {
if (context && context->playback ) {
case OUTPUT_REVERSE:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_REVERSE, "video");
ret |=
context->output->video->Command(context,
OUTPUT_REVERSE,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_REVERSE, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_REVERSE,
"audio");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_CONTINUE: {
if (context && context->playback ) {
case OUTPUT_CONTINUE:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_CONTINUE, "video");
ret |=
context->output->video->Command(context,
OUTPUT_CONTINUE,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_CONTINUE, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_CONTINUE,
"audio");
//if (context->playback->isSubtitle)
// ret |= context->output->subtitle->Command(context, OUTPUT_CONTINUE, "subtitle");
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_AVSYNC: {
if (context && context->playback ) {
if (context->playback->isVideo && context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_AVSYNC, "audio");
case OUTPUT_AVSYNC:{
if (context && context->playback) {
if (context->playback->isVideo
&& context->playback->isAudio)
ret |=
context->output->audio->Command(context,
OUTPUT_AVSYNC,
"audio");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_CLEAR: {
if (context && context->playback ) {
if (context->playback->isVideo && (argument == NULL || *(char *) argument == 'v'))
ret |= context->output->video->Command(context, OUTPUT_CLEAR, "video");
if (context->playback->isAudio && (argument == NULL || *(char *) argument == 'a'))
ret |= context->output->audio->Command(context, OUTPUT_CLEAR, "audio");
case OUTPUT_CLEAR:{
if (context && context->playback) {
if (context->playback->isVideo
&& (argument == NULL || *(char *) argument == 'v'))
ret |=
context->output->video->Command(context,
OUTPUT_CLEAR,
"video");
if (context->playback->isAudio
&& (argument == NULL || *(char *) argument == 'a'))
ret |=
context->output->audio->Command(context,
OUTPUT_CLEAR,
"audio");
//if (context->playback->isSubtitle && (argument == NULL || *(char *) argument == 's'))
// ret |= context->output->subtitle->Command(context, OUTPUT_CLEAR, "subtitle");
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_PTS: {
if (context && context->playback ) {
case OUTPUT_PTS:{
if (context && context->playback) {
if (context->playback->isVideo)
return context->output->video->Command(context, OUTPUT_PTS, argument);
return context->output->video->Command(context,
OUTPUT_PTS,
argument);
if (context->playback->isAudio)
return context->output->audio->Command(context, OUTPUT_PTS, argument);
return context->output->audio->Command(context,
OUTPUT_PTS,
argument);
//if (context->playback->isSubtitle)
// return context->output->subtitle->Command(context, OUTPUT_PTS, "subtitle");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_SWITCH: {
if (context && context->playback ) {
case OUTPUT_SWITCH:{
if (context && context->playback) {
if (context->playback->isAudio)
return context->output->audio->Command(context, OUTPUT_SWITCH, "audio");
return context->output->audio->Command(context,
OUTPUT_SWITCH,
"audio");
if (context->playback->isVideo)
return context->output->video->Command(context, OUTPUT_SWITCH, "video");
return context->output->video->Command(context,
OUTPUT_SWITCH,
"video");
if (context->playback->isDvbSubtitle)
ret |= context->output->dvbsubtitle->Command(context, command, "dvbsubtitle");
ret |=
context->output->dvbsubtitle->Command(context,
command,
"dvbsubtitle");
if (context->playback->isTeletext)
ret |= context->output->teletext->Command(context, command, "teletext");
ret |=
context->output->teletext->Command(context,
command,
"teletext");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_SLOWMOTION: {
if (context && context->playback ) {
case OUTPUT_SLOWMOTION:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_SLOWMOTION, "video");
ret |=
context->output->video->Command(context,
OUTPUT_SLOWMOTION,
"video");
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_SLOWMOTION, "audio");
ret |=
context->output->audio->Command(context,
OUTPUT_SLOWMOTION,
"audio");
//if (context->playback->isSubtitle)
// ret |= context->output->subtitle->Command(context, OUTPUT_PAUSE, "subtitle");
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_AUDIOMUTE: {
if (context && context->playback ) {
case OUTPUT_AUDIOMUTE:{
if (context && context->playback) {
if (context->playback->isAudio)
ret |= context->output->audio->Command(context, OUTPUT_AUDIOMUTE, (char*) argument);
ret |=
context->output->audio->Command(context,
OUTPUT_AUDIOMUTE,
(char *) argument);
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_DISCONTINUITY_REVERSE: {
if (context && context->playback ) {
case OUTPUT_DISCONTINUITY_REVERSE:{
if (context && context->playback) {
if (context->playback->isVideo)
ret |= context->output->video->Command(context, OUTPUT_DISCONTINUITY_REVERSE, (void*) argument);
ret |=
context->output->video->Command(context,
OUTPUT_DISCONTINUITY_REVERSE,
(void *) argument);
} else
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
case OUTPUT_GET_FRAME_COUNT: {
if (context && context->playback ) {
case OUTPUT_GET_FRAME_COUNT:{
if (context && context->playback) {
if (context->playback->isVideo)
return context->output->video->Command(context, OUTPUT_GET_FRAME_COUNT, argument);
return context->output->video->Command(context,
OUTPUT_GET_FRAME_COUNT,
argument);
if (context->playback->isAudio)
return context->output->audio->Command(context, OUTPUT_GET_FRAME_COUNT, argument);
return context->output->audio->Command(context,
OUTPUT_GET_FRAME_COUNT,
argument);
//if (context->playback->isSubtitle)
// return context->output->subtitle->Command(context, OUTPUT_GET_FRAME_COUNT, "subtitle");
} else
@@ -386,12 +535,14 @@ static int Command(void *_context, OutputCmd_t command, void * argument) {
break;
}
default:
output_err("%s::%s OutputCmd %d not supported!\n", FILENAME, __FUNCTION__, command);
output_err("%s::%s OutputCmd %d not supported!\n", FILENAME,
__FUNCTION__, command);
ret = cERR_OUTPUT_INTERNAL_ERROR;
break;
}
output_printf(10, "%s::%s exiting with value %d\n", FILENAME, __FUNCTION__, ret);
output_printf(10, "%s::%s exiting with value %d\n", FILENAME,
__FUNCTION__, ret);
return ret;
}

View File

@@ -81,13 +81,17 @@ pthread_mutex_t Pipemutex;
/* ***************************** */
/* Prototypes */
/* ***************************** */
int PipeStop(Context_t *context, char * type);
int PipeStop(Context_t * context, char *type);
/* ***************************** */
/* MISC Functions */
/* ***************************** */
void getPipeMutex(const char *filename __attribute__((unused)), const char *function __attribute__((unused)), int line __attribute__((unused))) {
void getPipeMutex(const char *filename
__attribute__ ((unused)), const char *function
__attribute__ ((unused)), int line
__attribute__ ((unused)))
{
pipe_printf(250, "requesting mutex\n");
@@ -96,14 +100,19 @@ void getPipeMutex(const char *filename __attribute__((unused)), const char *func
pipe_printf(250, "received mutex\n");
}
void releasePipeMutex(const char *filename __attribute__((unused)), const char *function __attribute__((unused)), int line __attribute__((unused))) {
void releasePipeMutex(const char *filename
__attribute__ ((unused)), const char *function
__attribute__ ((unused)), int line
__attribute__ ((unused)))
{
pthread_mutex_unlock(&Pipemutex);
pipe_printf(250, "released mutex\n");
}
int PipeOpen(Context_t *context __attribute__((unused)), char * type) {
int PipeOpen(Context_t * context __attribute__ ((unused)), char *type)
{
unsigned char teletext = !strcmp("teletext", type);
unsigned char dvbsubtitle = !strcmp("dvbsubtitle", type);
@@ -113,9 +122,9 @@ int PipeOpen(Context_t *context __attribute__((unused)), char * type) {
mkfifo(TELETEXTPIPE, 0644);
teletextfd = open(TELETEXTPIPE, O_RDWR | O_NONBLOCK);
if (teletextfd < 0)
{
pipe_err("failed to open %s - errno %d\n", TELETEXTPIPE, errno);
if (teletextfd < 0) {
pipe_err("failed to open %s - errno %d\n", TELETEXTPIPE,
errno);
pipe_err("%s\n", strerror(errno));
return cERR_PIPE_ERROR;
}
@@ -124,9 +133,9 @@ int PipeOpen(Context_t *context __attribute__((unused)), char * type) {
mkfifo(DVBSUBTITLEPIPE, 0644);
dvbsubtitlefd = open(DVBSUBTITLEPIPE, O_RDWR | O_NONBLOCK);
if (dvbsubtitlefd < 0)
{
pipe_err("failed to open %s - errno %d\n", DVBSUBTITLEPIPE, errno);
if (dvbsubtitlefd < 0) {
pipe_err("failed to open %s - errno %d\n", DVBSUBTITLEPIPE,
errno);
pipe_err("%s\n", strerror(errno));
return cERR_PIPE_ERROR;
}
@@ -135,7 +144,8 @@ int PipeOpen(Context_t *context __attribute__((unused)), char * type) {
return cERR_PIPE_NO_ERROR;
}
int PipeClose(Context_t *context, char * type) {
int PipeClose(Context_t * context, char *type)
{
unsigned char dvbsubtitle = !strcmp("dvbsubtitle", type);
unsigned char teletext = !strcmp("teletext", type);
@@ -147,7 +157,7 @@ int PipeClose(Context_t *context, char * type) {
*/
PipeStop(context, type);
getPipeMutex(FILENAME, __FUNCTION__,__LINE__);
getPipeMutex(FILENAME, __FUNCTION__, __LINE__);
if (dvbsubtitle && dvbsubtitlefd != -1) {
close(dvbsubtitlefd);
@@ -158,11 +168,13 @@ int PipeClose(Context_t *context, char * type) {
teletextfd = -1;
}
releasePipeMutex(FILENAME, __FUNCTION__,__LINE__);
releasePipeMutex(FILENAME, __FUNCTION__, __LINE__);
return cERR_PIPE_NO_ERROR;
}
int PipePlay(Context_t *context __attribute__((unused)), char * type __attribute__((unused))) {
int PipePlay(Context_t * context __attribute__ ((unused)), char *type
__attribute__ ((unused)))
{
int ret = cERR_PIPE_NO_ERROR;
#if 0
@@ -179,7 +191,9 @@ int PipePlay(Context_t *context __attribute__((unused)), char * type __attribut
return ret;
}
int PipeStop(Context_t *context __attribute__((unused)), char * type __attribute__((unused))) {
int PipeStop(Context_t * context __attribute__ ((unused)), char *type
__attribute__ ((unused)))
{
int ret = cERR_PIPE_NO_ERROR;
#if 0
@@ -188,38 +202,40 @@ int PipeStop(Context_t *context __attribute__((unused)), char * type __attribut
pipe_printf(10, "t%d d%d\n", teletext, dvbsubtitle);
getPipeMutex(FILENAME, __FUNCTION__,__LINE__);
getPipeMutex(FILENAME, __FUNCTION__, __LINE__);
if (dvbsubtitle && dvbsubtitlefd != -1) {
}
if (teletext && teletextfd != -1) {
}
releasePipeMutex(FILENAME, __FUNCTION__,__LINE__);
releasePipeMutex(FILENAME, __FUNCTION__, __LINE__);
#endif
return ret;
}
int PipeFlush(Context_t *context __attribute__((unused)), char * type) {
int PipeFlush(Context_t * context __attribute__ ((unused)), char *type)
{
unsigned char dvbsubtitle = !strcmp("dvbsubtitle", type);
unsigned char teletext = !strcmp("teletext", type);
pipe_printf(10, "t%d d%d\n", teletext, dvbsubtitle);
if ( (dvbsubtitle && dvbsubtitlefd != -1) || (teletext && teletextfd != -1) ) {
getPipeMutex(FILENAME, __FUNCTION__,__LINE__);
if ((dvbsubtitle && dvbsubtitlefd != -1)
|| (teletext && teletextfd != -1)) {
getPipeMutex(FILENAME, __FUNCTION__, __LINE__);
if (dvbsubtitle && dvbsubtitlefd != -1) {
char buf[65536];
while(0 < read(dvbsubtitlefd, buf, sizeof(buf)));
while (0 < read(dvbsubtitlefd, buf, sizeof(buf)));
}
if (teletext && teletextfd != -1) {
char buf[65536];
while(0 < read(teletextfd, buf, sizeof(buf)));
while (0 < read(teletextfd, buf, sizeof(buf)));
}
releasePipeMutex(FILENAME, __FUNCTION__,__LINE__);
releasePipeMutex(FILENAME, __FUNCTION__, __LINE__);
}
pipe_printf(10, "exiting\n");
@@ -227,26 +243,28 @@ int PipeFlush(Context_t *context __attribute__((unused)), char * type) {
return cERR_PIPE_NO_ERROR;
}
int PipeClear(Context_t *context __attribute__((unused)), char * type) {
int PipeClear(Context_t * context __attribute__ ((unused)), char *type)
{
int ret = cERR_PIPE_NO_ERROR;
unsigned char dvbsubtitle = !strcmp("dvbsubtitle", type);
unsigned char teletext = !strcmp("teletext", type);
pipe_printf(10, "v%d a%d\n", dvbsubtitle, teletext);
if ( (dvbsubtitle && dvbsubtitlefd != -1) || (teletext && teletextfd != -1) ) {
getPipeMutex(FILENAME, __FUNCTION__,__LINE__);
if ((dvbsubtitle && dvbsubtitlefd != -1)
|| (teletext && teletextfd != -1)) {
getPipeMutex(FILENAME, __FUNCTION__, __LINE__);
if (dvbsubtitle && dvbsubtitlefd != -1) {
char buf[65536];
while(0 < read(dvbsubtitlefd, buf, sizeof(buf)));
while (0 < read(dvbsubtitlefd, buf, sizeof(buf)));
}
if (teletext && teletextfd != -1) {
char buf[65536];
while(0 < read(teletextfd, buf, sizeof(buf)));
while (0 < read(teletextfd, buf, sizeof(buf)));
}
releasePipeMutex(FILENAME, __FUNCTION__,__LINE__);
releasePipeMutex(FILENAME, __FUNCTION__, __LINE__);
}
pipe_printf(10, "exiting\n");
@@ -254,15 +272,18 @@ int PipeClear(Context_t *context __attribute__((unused)), char * type) {
return ret;
}
int PipeSwitch(Context_t *context __attribute__((unused)), char * type __attribute__((unused))) {
int PipeSwitch(Context_t * context __attribute__ ((unused)), char *type
__attribute__ ((unused)))
{
#if 0
unsigned char dvbsubtitle = !strcmp("dvbsubtitle", type);
unsigned char teletext = !strcmp("teletext", type);
pipe_printf(10, "v%d a%d\n", dvbsubtitle, teletext);
if ( (dvbsubtitle && dvbsubtitlefd != -1) || (teletext && teletextfd != -1) ) {
getPipeMutex(FILENAME, __FUNCTION__,__LINE__);
if ((dvbsubtitle && dvbsubtitlefd != -1)
|| (teletext && teletextfd != -1)) {
getPipeMutex(FILENAME, __FUNCTION__, __LINE__);
if (teletext && teletextfd != -1) {
}
@@ -270,7 +291,7 @@ int PipeSwitch(Context_t *context __attribute__((unused)), char * type __attrib
if (dvbsubtitle && dvbsubtitlefd != -1) {
}
releasePipeMutex(FILENAME, __FUNCTION__,__LINE__);
releasePipeMutex(FILENAME, __FUNCTION__, __LINE__);
}
@@ -279,7 +300,8 @@ int PipeSwitch(Context_t *context __attribute__((unused)), char * type __attrib
return cERR_PIPE_NO_ERROR;
}
static int writePESDataTeletext(int fd, unsigned char *data, size_t data_len)
static int writePESDataTeletext(int fd, unsigned char *data,
size_t data_len)
{
unsigned int len = 0;
if (data_len > 0) {
@@ -299,13 +321,14 @@ static int writePESDataTeletext(int fd, unsigned char *data, size_t data_len)
if (len != iov[0].iov_len + iov[1].iov_len) {
// writing to pipe failed, clear it.
char buf[65536];
while(0 < read(fd, buf, sizeof(buf)));
while (0 < read(fd, buf, sizeof(buf)));
}
}
return len;
}
static int writePESDataDvbsubtitle(int fd, unsigned char *data, size_t data_len, int64_t pts)
static int writePESDataDvbsubtitle(int fd, unsigned char *data,
size_t data_len, int64_t pts)
{
int len = 0;
if (data_len > 0) {
@@ -322,11 +345,11 @@ static int writePESDataDvbsubtitle(int fd, unsigned char *data, size_t data_len,
header[13] = 0x01 | ((pts << 1) & 0xff);
pts >>= 7;
header[12] = pts & 0xff;
pts >>=8;
pts >>= 8;
header[11] = 0x01 | ((pts << 1) & 0xff);
pts >>= 7;
header[10] = pts & 0xff;
pts >>=8;
pts >>= 8;
header[9] = 0x21 | ((pts << 1) & 0xff);
}
header[8] = 14 - 9;
@@ -337,25 +360,24 @@ static int writePESDataDvbsubtitle(int fd, unsigned char *data, size_t data_len,
iov[1].iov_base = data;
iov[1].iov_len = data_len;
len = writev(fd, iov, 2);
if (len != (int)(iov[0].iov_len + iov[1].iov_len)) {
if (len != (int) (iov[0].iov_len + iov[1].iov_len)) {
// writing to pipe failed, clear it.
char buf[65536];
while(0 < read(fd, buf, sizeof(buf)));
while (0 < read(fd, buf, sizeof(buf)));
}
}
return len;
}
static int Write(void *_context __attribute__((unused)), void* _out)
static int Write(void *_context __attribute__ ((unused)), void *_out)
{
AudioVideoOut_t *out = (AudioVideoOut_t*) _out;
AudioVideoOut_t *out = (AudioVideoOut_t *) _out;
int ret = cERR_PIPE_NO_ERROR;
int res = 0;
unsigned char dvbsubtitle;
unsigned char teletext;
if (out == NULL)
{
if (out == NULL) {
pipe_err("null pointer passed\n");
return cERR_PIPE_ERROR;
}
@@ -363,22 +385,23 @@ static int Write(void *_context __attribute__((unused)), void* _out)
dvbsubtitle = !strcmp("dvbsubtitle", out->type);
teletext = !strcmp("teletext", out->type);
pipe_printf(20, "DataLength=%u PrivateLength=%u Pts=%llu FrameRate=%f\n",
pipe_printf(20,
"DataLength=%u PrivateLength=%u Pts=%llu FrameRate=%f\n",
out->len, out->extralen, out->pts, out->frameRate);
pipe_printf(20, "v%d a%d\n", dvbsubtitle, teletext);
if (dvbsubtitle) {
res = writePESDataDvbsubtitle(dvbsubtitlefd, out->data, out->len, out->pts);
res =
writePESDataDvbsubtitle(dvbsubtitlefd, out->data, out->len,
out->pts);
if (res <= 0)
{
if (res <= 0) {
ret = cERR_PIPE_ERROR;
}
} else if (teletext) {
res = writePESDataTeletext(teletextfd, out->data, out->len);
if (res <= 0)
{
if (res <= 0) {
ret = cERR_PIPE_ERROR;
}
}
@@ -386,49 +409,50 @@ static int Write(void *_context __attribute__((unused)), void* _out)
return ret;
}
static int reset(Context_t *context __attribute__((unused)))
static int reset(Context_t * context __attribute__ ((unused)))
{
int ret = cERR_PIPE_NO_ERROR;
return ret;
}
static int Command(void *_context, OutputCmd_t command, void * argument) {
Context_t* context = (Context_t*) _context;
static int Command(void *_context, OutputCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_PIPE_NO_ERROR;
pipe_printf(50, "Command %d\n", command);
switch(command) {
case OUTPUT_OPEN: {
ret = PipeOpen(context, (char*)argument);
switch (command) {
case OUTPUT_OPEN:{
ret = PipeOpen(context, (char *) argument);
break;
}
case OUTPUT_CLOSE: {
ret = PipeClose(context, (char*)argument);
case OUTPUT_CLOSE:{
ret = PipeClose(context, (char *) argument);
reset(context);
break;
}
case OUTPUT_PLAY: { // 4
ret = PipePlay(context, (char*)argument);
case OUTPUT_PLAY:{ // 4
ret = PipePlay(context, (char *) argument);
break;
}
case OUTPUT_STOP: {
case OUTPUT_STOP:{
reset(context);
ret = PipeStop(context, (char*)argument);
ret = PipeStop(context, (char *) argument);
break;
}
case OUTPUT_FLUSH: {
ret = PipeFlush(context, (char*)argument);
case OUTPUT_FLUSH:{
ret = PipeFlush(context, (char *) argument);
reset(context);
break;
}
case OUTPUT_CLEAR: {
ret = PipeClear(context, (char*)argument);
case OUTPUT_CLEAR:{
ret = PipeClear(context, (char *) argument);
break;
}
case OUTPUT_SWITCH: {
ret = PipeSwitch(context, (char*)argument);
case OUTPUT_SWITCH:{
ret = PipeSwitch(context, (char *) argument);
break;
}
default:

View File

@@ -81,7 +81,7 @@ Number, Style, Name,, MarginL, MarginR, MarginV, Effect,, Text
/* ***************************** */
struct sub_t {
char * text;
char *text;
unsigned long long int pts;
unsigned long int milliDuration;
};
@@ -95,7 +95,7 @@ static pthread_mutex_t mutex;
static pthread_t thread_sub;
void* clientData = NULL;
void *clientData = NULL;
void (*clientFunction) (long int, size_t, char *, void *);
static struct sub_t subPuffer[PUFFERSIZE];
@@ -116,7 +116,8 @@ static uint32_t *destination = NULL;
/* ***************************** */
/* MISC Functions */
/* ***************************** */
static void getMutex(int line) {
static void getMutex(int line)
{
subtitle_printf(100, "%d requesting mutex\n", line);
pthread_mutex_lock(&mutex);
@@ -124,22 +125,24 @@ static void getMutex(int line) {
subtitle_printf(100, "%d received mutex\n", line);
}
static void releaseMutex(int line) {
static void releaseMutex(int line)
{
pthread_mutex_unlock(&mutex);
subtitle_printf(100, "%d released mutex\n", line);
}
void replace_all(char ** string, char * search, char * replace) {
void replace_all(char **string, char *search, char *replace)
{
int len = 0;
char * ptr = NULL;
char *ptr = NULL;
char tempString[512];
char newString[512];
newString[0] = '\0';
if ((string == NULL) || (*string == NULL) || (search == NULL) || (replace == NULL))
{
if ((string == NULL) || (*string == NULL) || (search == NULL)
|| (replace == NULL)) {
subtitle_err("null pointer passed\n");
return;
}
@@ -156,27 +159,27 @@ void replace_all(char ** string, char * search, char * replace) {
strcat(newString, replace);
len += strlen(search);
strcat(newString, tempString+len);
strcat(newString, tempString + len);
strcpy(tempString, newString);
}
subtitle_printf(20, "strdup in line %d\n", __LINE__);
if(newString[0] != '\0')
if (newString[0] != '\0')
*string = strdup(newString);
else
*string = strdup(tempString);
}
int subtitle_ParseASS (char **Line) {
char* Text;
int subtitle_ParseASS(char **Line)
{
char *Text;
int i;
char* ptr1;
char *ptr1;
if ((Line == NULL) || (*Line == NULL))
{
if ((Line == NULL) || (*Line == NULL)) {
subtitle_err("null pointer passed\n");
return cERR_SUBTITLE_ERROR;
}
@@ -187,9 +190,9 @@ int subtitle_ParseASS (char **Line) {
ptr1 = Text;
for (i=0; i < 9 && *ptr1 != '\0'; ptr1++) {
for (i = 0; i < 9 && *ptr1 != '\0'; ptr1++) {
subtitle_printf(20, "%s",ptr1);
subtitle_printf(20, "%s", ptr1);
if (*ptr1 == ',')
i++;
@@ -210,10 +213,10 @@ int subtitle_ParseASS (char **Line) {
return cERR_SUBTITLE_NO_ERROR;
}
int subtitle_ParseSRT (char **Line) {
int subtitle_ParseSRT(char **Line)
{
if ((Line == NULL) || (*Line == NULL))
{
if ((Line == NULL) || (*Line == NULL)) {
subtitle_err("null pointer passed\n");
return cERR_SUBTITLE_ERROR;
}
@@ -237,10 +240,10 @@ int subtitle_ParseSRT (char **Line) {
return cERR_SUBTITLE_NO_ERROR;
}
int subtitle_ParseSSA (char **Line) {
int subtitle_ParseSSA(char **Line)
{
if ((Line == NULL) || (*Line == NULL))
{
if ((Line == NULL) || (*Line == NULL)) {
subtitle_err("null pointer passed\n");
return cERR_SUBTITLE_ERROR;
}
@@ -264,31 +267,29 @@ int subtitle_ParseSSA (char **Line) {
return cERR_SUBTITLE_NO_ERROR;
}
void addSub(Context_t *context, char * text, unsigned long long int pts, unsigned long int milliDuration) {
void addSub(Context_t * context, char *text, unsigned long long int pts,
unsigned long int milliDuration)
{
int count = 20;
subtitle_printf(50, "index %d\n", writePointer);
if(context && context->playback && !context->playback->isPlaying)
{
if (context && context->playback && !context->playback->isPlaying) {
subtitle_err("1. aborting ->no playback\n");
return;
}
if (text == NULL)
{
if (text == NULL) {
subtitle_err("null pointer passed\n");
return;
}
if (pts == 0)
{
if (pts == 0) {
subtitle_err("pts 0\n");
return;
}
if (milliDuration == 0)
{
if (milliDuration == 0) {
subtitle_err("duration 0\n");
return;
}
@@ -296,8 +297,7 @@ void addSub(Context_t *context, char * text, unsigned long long int pts, unsign
while (subPuffer[writePointer].text != NULL) {
//List is full, wait till we got some free space
if(context && context->playback && !context->playback->isPlaying)
{
if (context && context->playback && !context->playback->isPlaying) {
subtitle_err("2. aborting ->no playback\n");
return;
}
@@ -306,23 +306,23 @@ void addSub(Context_t *context, char * text, unsigned long long int pts, unsign
* is available we start ring from the beginning and loose some stuff
* which is acceptable!
*/
subtitle_printf(10, "waiting on free buffer %d - %d (%d) ...\n", writePointer, readPointer, count);
subtitle_printf(10, "waiting on free buffer %d - %d (%d) ...\n",
writePointer, readPointer, count);
usleep(10000);
count--;
if (count == 0)
{
if (count == 0) {
subtitle_err("abort waiting on buffer...\n");
break;
}
}
subtitle_printf(20, "from mkv: %s pts:%lld milliDuration:%lud\n",text,pts,milliDuration);
subtitle_printf(20, "from mkv: %s pts:%lld milliDuration:%lud\n", text,
pts, milliDuration);
getMutex(__LINE__);
if (count == 0)
{
if (count == 0) {
int i;
subtitle_err("freeing not delivered data\n");
@@ -348,8 +348,7 @@ void addSub(Context_t *context, char * text, unsigned long long int pts, unsign
if (writePointer == PUFFERSIZE)
writePointer = 0;
if (writePointer == readPointer)
{
if (writePointer == readPointer) {
/* this should not happen, and means that there is nor reader or
* the reader has performance probs ;)
* the recovery is done at startup of this function - but next time
@@ -362,20 +361,20 @@ void addSub(Context_t *context, char * text, unsigned long long int pts, unsign
subtitle_printf(10, "<\n");
}
int getNextSub(char ** text, unsigned long long int * pts, long int * milliDuration) {
int getNextSub(char **text, unsigned long long int *pts,
long int *milliDuration)
{
subtitle_printf(50, "index %d\n", readPointer);
if (text == NULL)
{
if (text == NULL) {
subtitle_err("null pointer passed\n");
return cERR_SUBTITLE_ERROR;
}
getMutex(__LINE__);
if (subPuffer[readPointer].text == NULL)
{
if (subPuffer[readPointer].text == NULL) {
/* this is acutally not an error, because it may happen
* that there is no subtitle for a while
*/
@@ -399,18 +398,18 @@ int getNextSub(char ** text, unsigned long long int * pts, long int * milliDurat
if (readPointer == PUFFERSIZE)
readPointer = 0;
if (writePointer == readPointer)
{
if (writePointer == readPointer) {
/* this may happen, in normal case the reader is ones ahead the
* writer. So this is the normal case that we eat the data
* and have the reader reached.
*/
subtitle_printf(20, "ups something went wrong. no more writers? \n");
subtitle_printf(20,
"ups something went wrong. no more writers? \n");
}
releaseMutex(__LINE__);
subtitle_printf(20, "readPointer %d\n",readPointer);
subtitle_printf(20, "readPointer %d\n", readPointer);
subtitle_printf(10, "<\n");
return cERR_SUBTITLE_NO_ERROR;
@@ -420,30 +419,30 @@ int getNextSub(char ** text, unsigned long long int * pts, long int * milliDurat
/* Worker Thread */
/* **************************** */
static void* SubtitleThread(void* data) {
Context_t *context = (Context_t*) data;
char * subText = NULL;
static void *SubtitleThread(void *data)
{
Context_t *context = (Context_t *) data;
char *subText = NULL;
long int subMilliDuration = 0;
unsigned long long int subPts = 0;
unsigned long long int Pts = 0;
subtitle_printf(10, "\n");
while ( context->playback->isCreationPhase ) {
while (context->playback->isCreationPhase) {
subtitle_err("Thread waiting for end of init phase...\n");
usleep(1000);
}
subtitle_printf(10, "done\n");
while ( context &&
context->playback &&
context->playback->isPlaying) {
while (context && context->playback && context->playback->isPlaying) {
int curtrackid = -1;
if (context && context->manager && context->manager->subtitle)
context->manager->subtitle->Command(context, MANAGER_GET, &curtrackid);
context->manager->subtitle->Command(context, MANAGER_GET,
&curtrackid);
subtitle_printf(50, "curtrackid %d\n", curtrackid);
@@ -455,49 +454,54 @@ static void* SubtitleThread(void* data) {
if (context && context->playback)
context->playback->Command(context, PLAYBACK_PTS, &Pts);
else return NULL;
else
return NULL;
if(Pts > subPts) {
subtitle_printf(10,"subtitle is to late, ignoring\n");
if(subText != NULL)
if (Pts > subPts) {
subtitle_printf(10, "subtitle is to late, ignoring\n");
if (subText != NULL)
free(subText);
continue;
}
subtitle_printf(20, "Pts:%llu < subPts%llu duration %ld\n", Pts, subPts,subMilliDuration);
subtitle_printf(20, "Pts:%llu < subPts%llu duration %ld\n",
Pts, subPts, subMilliDuration);
while ( context &&
while (context &&
context->playback &&
context->playback->isPlaying &&
Pts < subPts) {
context->playback->isPlaying && Pts < subPts) {
unsigned long int diff = subPts - Pts;
diff = (diff*1000)/90.0;
diff = (diff * 1000) / 90.0;
subtitle_printf(50, "DIFF: %lud\n", diff);
if(diff > 100)
if (diff > 100)
usleep(diff);
if (context && context->playback)
context->playback->Command(context, PLAYBACK_PTS, &Pts);
else
{
context->playback->Command(context, PLAYBACK_PTS,
&Pts);
else {
subtitle_err("no playback ? terminated?\n");
break;
}
subtitle_printf(20, "cur: %llu wanted: %llu\n", Pts, subPts);
subtitle_printf(20, "cur: %llu wanted: %llu\n", Pts,
subPts);
}
if ( context &&
if (context &&
context->playback &&
context->playback->isPlaying &&
subText != NULL ) {
context->playback->isPlaying && subText != NULL) {
if(clientFunction != NULL)
clientFunction(subMilliDuration, strlen(subText), subText, clientData);
if (clientFunction != NULL)
clientFunction(subMilliDuration, strlen(subText),
subText, clientData);
else
subtitle_printf(10, "writing Sub failed (%ld) (%d) \"%s\"\n", subMilliDuration, strlen(subText), subText);
subtitle_printf(10,
"writing Sub failed (%ld) (%d) \"%s\"\n",
subMilliDuration, strlen(subText),
subText);
free(subText);
}
@@ -519,30 +523,28 @@ static void* SubtitleThread(void* data) {
/* Functions */
/* ***************************** */
static int Write(void* _context, void *data) {
Context_t * context = (Context_t *) _context;
char * Encoding = NULL;
char * Text;
SubtitleOut_t * out;
static int Write(void *_context, void *data)
{
Context_t *context = (Context_t *) _context;
char *Encoding = NULL;
char *Text;
SubtitleOut_t *out;
int DataLength;
unsigned long long int Pts;
float Duration;
subtitle_printf(10, "\n");
if (data == NULL)
{
if (data == NULL) {
subtitle_err("null pointer passed\n");
return cERR_SUBTITLE_ERROR;
}
out = (SubtitleOut_t*) data;
out = (SubtitleOut_t *) data;
if (out->type == eSub_Txt)
{
Text = strdup((const char*) out->u.text.data);
} else
{
if (out->type == eSub_Txt) {
Text = strdup((const char *) out->u.text.data);
} else {
/* fixme handle gfx subs from container_ass and send it to
* the callback. this must be implemented also in e2/neutrino
* then.
@@ -555,35 +557,35 @@ static int Write(void* _context, void *data) {
Pts = out->pts;
Duration = out->duration;
context->manager->subtitle->Command(context, MANAGER_GETENCODING, &Encoding);
context->manager->subtitle->Command(context, MANAGER_GETENCODING,
&Encoding);
if (Encoding == NULL)
{
if (Encoding == NULL) {
subtitle_err("encoding unknown\n");
free(Text);
return cERR_SUBTITLE_ERROR;
}
subtitle_printf(20, "Encoding:%s Text:%s Len:%d\n", Encoding,Text, DataLength);
subtitle_printf(20, "Encoding:%s Text:%s Len:%d\n", Encoding, Text,
DataLength);
if ( !strncmp("S_TEXT/SSA", Encoding, 10) ||
if (!strncmp("S_TEXT/SSA", Encoding, 10) ||
!strncmp("S_SSA", Encoding, 5))
subtitle_ParseSSA(&Text);
else if(!strncmp("S_TEXT/ASS", Encoding, 10) ||
else if (!strncmp("S_TEXT/ASS", Encoding, 10) ||
!strncmp("S_AAS", Encoding, 5))
subtitle_ParseASS(&Text);
else if(!strncmp("S_TEXT/SRT", Encoding, 10) ||
else if (!strncmp("S_TEXT/SRT", Encoding, 10) ||
!strncmp("S_SRT", Encoding, 5))
subtitle_ParseSRT(&Text);
else
{
else {
subtitle_err("unknown encoding %s\n", Encoding);
return cERR_SUBTITLE_ERROR;
}
subtitle_printf(10, "Text:%s Duration:%f\n", Text,Duration);
subtitle_printf(10, "Text:%s Duration:%f\n", Text, Duration);
addSub(context, Text, Pts, Duration * 1000);
@@ -595,13 +597,13 @@ static int Write(void* _context, void *data) {
return cERR_SUBTITLE_NO_ERROR;
}
static int subtitle_Open(Context_t* context __attribute__((unused))) {
static int subtitle_Open(Context_t * context __attribute__ ((unused)))
{
int i;
subtitle_printf(10, "\n");
if (isSubtitleOpened == 1)
{
if (isSubtitleOpened == 1) {
subtitle_err("already opened! ignoring\n");
return cERR_SUBTITLE_ERROR;
}
@@ -627,7 +629,8 @@ static int subtitle_Open(Context_t* context __attribute__((unused))) {
return cERR_SUBTITLE_NO_ERROR;
}
static int subtitle_Close(Context_t* context __attribute__((unused))) {
static int subtitle_Close(Context_t * context __attribute__ ((unused)))
{
int i;
subtitle_printf(10, "\n");
@@ -656,29 +659,26 @@ static int subtitle_Close(Context_t* context __attribute__((unused))) {
return cERR_SUBTITLE_NO_ERROR;
}
static int subtitle_Play(Context_t* context) {
static int subtitle_Play(Context_t * context)
{
subtitle_printf(10, "\n");
if (hasThreadStarted == 0)
{
if (hasThreadStarted == 0) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (pthread_create (&thread_sub, &attr, &SubtitleThread, (void*) context) != 0)
{
if (pthread_create
(&thread_sub, &attr, &SubtitleThread, (void *) context) != 0) {
subtitle_err("Error creating thread\n");
hasThreadStarted = 0;
} else
{
} else {
subtitle_printf(10, "Created thread\n");
hasThreadStarted = 1;
}
}
else
{
} else {
subtitle_err("thread already created.\n");
return cERR_SUBTITLE_ERROR;
}
@@ -688,14 +688,17 @@ static int subtitle_Play(Context_t* context) {
return cERR_SUBTITLE_NO_ERROR;
}
static int subtitle_Stop(Context_t* context __attribute__((unused))) {
static int subtitle_Stop(Context_t * context __attribute__ ((unused)))
{
int wait_time = 20;
int i;
subtitle_printf(10, "\n");
while ( (hasThreadStarted != 0) && (--wait_time) > 0 ) {
subtitle_printf(10, "Waiting for subtitle thread to terminate itself, will try another %d times\n", wait_time);
while ((hasThreadStarted != 0) && (--wait_time) > 0) {
subtitle_printf(10,
"Waiting for subtitle thread to terminate itself, will try another %d times\n",
wait_time);
usleep(100000);
}
@@ -740,43 +743,44 @@ void subtitle_SignalConnect(void (*fkt) (long int, size_t, char *, void *))
clientFunction = fkt;
}
void subtitle_SignalConnectBuffer(void* data)
void subtitle_SignalConnectBuffer(void *data)
{
subtitle_printf(10, "%p\n", data);
clientData = data;
}
static int Command(void *_context, OutputCmd_t command, void * argument) {
Context_t *context = (Context_t*) _context;
static int Command(void *_context, OutputCmd_t command, void *argument)
{
Context_t *context = (Context_t *) _context;
int ret = cERR_SUBTITLE_NO_ERROR;
subtitle_printf(50, "%d\n", command);
switch(command) {
case OUTPUT_OPEN: {
switch (command) {
case OUTPUT_OPEN:{
ret = subtitle_Open(context);
break;
}
case OUTPUT_CLOSE: {
case OUTPUT_CLOSE:{
ret = subtitle_Close(context);
break;
}
case OUTPUT_PLAY: {
case OUTPUT_PLAY:{
ret = subtitle_Play(context);
break;
}
case OUTPUT_STOP: {
case OUTPUT_STOP:{
ret = subtitle_Stop(context);
break;
}
case OUTPUT_SWITCH: {
case OUTPUT_SWITCH:{
subtitle_err("Subtitle Switch not implemented\n");
ret = cERR_SUBTITLE_ERROR;
break;
}
case OUTPUT_GET_SUBTITLE_OUTPUT: {
SubtitleOutputDef_t* out = (SubtitleOutputDef_t*)argument;
case OUTPUT_GET_SUBTITLE_OUTPUT:{
SubtitleOutputDef_t *out = (SubtitleOutputDef_t *) argument;
out->screen_width = screen_width;
out->screen_height = screen_height;
out->framebufferBlit = framebufferBlit;
@@ -784,8 +788,8 @@ static int Command(void *_context, OutputCmd_t command, void * argument) {
out->destStride = destStride;
break;
}
case OUTPUT_SET_SUBTITLE_OUTPUT: {
SubtitleOutputDef_t* out = (SubtitleOutputDef_t*)argument;
case OUTPUT_SET_SUBTITLE_OUTPUT:{
SubtitleOutputDef_t *out = (SubtitleOutputDef_t *) argument;
screen_width = out->screen_width;
screen_height = out->screen_height;
framebufferBlit = out->framebufferBlit;
@@ -793,25 +797,25 @@ static int Command(void *_context, OutputCmd_t command, void * argument) {
destStride = out->destStride;
break;
}
case OUTPUT_SUBTITLE_REGISTER_FUNCTION: {
case OUTPUT_SUBTITLE_REGISTER_FUNCTION:{
subtitle_SignalConnect(argument);
break;
}
case OUTPUT_SUBTITLE_REGISTER_BUFFER: {
case OUTPUT_SUBTITLE_REGISTER_BUFFER:{
subtitle_SignalConnectBuffer(argument);
break;
}
case OUTPUT_FLUSH: {
case OUTPUT_FLUSH:{
subtitle_err("Subtitle Flush not implemented\n");
ret = cERR_SUBTITLE_ERROR;
break;
}
case OUTPUT_PAUSE: {
case OUTPUT_PAUSE:{
subtitle_err("Subtitle Pause not implemented\n");
ret = cERR_SUBTITLE_ERROR;
break;
}
case OUTPUT_CONTINUE: {
case OUTPUT_CONTINUE:{
subtitle_err("Subtitle Continue not implemented\n");
ret = cERR_SUBTITLE_ERROR;
break;

View File

@@ -193,7 +193,8 @@ else
static unsigned char DefaultAACHeader[] = {
0xff,
0xf1,
/*0x00, 0x00*/0x50, //((Profile & 0x03) << 6) | (SampleIndex << 2) | ((Channels >> 2) & 0x01);s
/*0x00, 0x00 */ 0x50,
//((Profile & 0x03) << 6) | (SampleIndex << 2) | ((Channels >> 2) & 0x01);s
0x80, //(Channels & 0x03) << 6;
0x00,
0x1f,
@@ -212,9 +213,9 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
unsigned char ExtraData[AAC_HEADER_LENGTH];
@@ -222,8 +223,7 @@ static int writeData(void* _call)
aac_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
aac_err("call data is NULL...\n");
return 0;
}
@@ -232,31 +232,29 @@ static int writeData(void* _call)
PacketLength = call->len + AAC_HEADER_LENGTH;
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
aac_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
aac_err("file pointer < 0. ignoring ...\n");
return 0;
}
if (call->private_data == NULL)
{
if (call->private_data == NULL) {
aac_printf(10, "private_data = NULL\n");
memcpy (ExtraData, DefaultAACHeader, AAC_HEADER_LENGTH);
}
else
memcpy (ExtraData, call->private_data, AAC_HEADER_LENGTH);
memcpy(ExtraData, DefaultAACHeader, AAC_HEADER_LENGTH);
} else
memcpy(ExtraData, call->private_data, AAC_HEADER_LENGTH);
ExtraData[3] |= (PacketLength >> 11) & 0x3;
ExtraData[4] = (PacketLength >> 3) & 0xff;
ExtraData[5] |= (PacketLength << 5) & 0xe0;
unsigned int HeaderLength = InsertPesHeader (PesHeader, PacketLength, AAC_AUDIO_PES_START_CODE, call->Pts, 0);
unsigned int HeaderLength =
InsertPesHeader(PesHeader, PacketLength, AAC_AUDIO_PES_START_CODE,
call->Pts, 0);
struct iovec iov[3];
iov[0].iov_base = PesHeader;

View File

@@ -92,30 +92,27 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
ac3_printf(10, "\n");
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
if (call == NULL)
{
if (call == NULL) {
ac3_err("call data is NULL...\n");
return 0;
}
ac3_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
ac3_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
ac3_err("file pointer < 0. ignoring ...\n");
return 0;
}
@@ -123,7 +120,9 @@ static int writeData(void* _call)
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, call->len, PRIVATE_STREAM_1_PES_START_CODE, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, call->len,
PRIVATE_STREAM_1_PES_START_CODE, call->Pts, 0);
iov[1].iov_base = call->data;
iov[1].iov_len = call->len;

View File

@@ -92,36 +92,32 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
unsigned char FakeHeaders[64]; // 64bytes should be enough to make the fake headers
unsigned int FakeHeaderLength;
unsigned char Version = 5;
unsigned int FakeStartCode = (Version << 8) | PES_VERSION_FAKE_START_CODE;
unsigned int FakeStartCode =
(Version << 8) | PES_VERSION_FAKE_START_CODE;
unsigned int usecPerFrame = 41708; /* Hellmaster1024: default value */
BitPacker_t ld = {FakeHeaders, 0, 32};
BitPacker_t ld = { FakeHeaders, 0, 32 };
divx_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
divx_err("call data is NULL...\n");
return 0;
}
divx_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
divx_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
divx_err("file pointer < 0. ignoring ...\n");
return 0;
}
@@ -141,7 +137,7 @@ static int writeData(void* _call)
PutBits(&ld, 0, 8); // profile = reserved
PutBits(&ld, 0x1b2, 32); // startcode (user data)
PutBits(&ld, 0x53545443, 32); // STTC - an embedded ST timecode from an avi file
PutBits(&ld, usecPerFrame , 32);
PutBits(&ld, usecPerFrame, 32);
// microseconds per frame
FlushBits(&ld);
@@ -150,13 +146,16 @@ static int writeData(void* _call)
struct iovec iov[4];
int ic = 0;
iov[ic].iov_base = PesHeader;
iov[ic++].iov_len = InsertPesHeader (PesHeader, call->len, MPEG_VIDEO_PES_START_CODE, call->Pts, FakeStartCode);
iov[ic++].iov_len =
InsertPesHeader(PesHeader, call->len, MPEG_VIDEO_PES_START_CODE,
call->Pts, FakeStartCode);
iov[ic].iov_base = FakeHeaders;
iov[ic++].iov_len = FakeHeaderLength;
if (initialHeader) {
iov[ic].iov_base = call->private_data;
iov[ic++].iov_len = call->private_size;
initialHeader = 0;
}
iov[ic].iov_base = call->data;

View File

@@ -94,52 +94,51 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_AUDIO_HEADER_SIZE];
dts_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
dts_err("call data is NULL...\n");
return 0;
}
dts_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
dts_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
dts_err("file pointer < 0. ignoring ...\n");
return 0;
}
// #define DO_BYTESWAP
#ifdef DO_BYTESWAP
unsigned char *Data = (unsigned char *) malloc(call->len);
memcpy(Data, call->data, call->len);
/* 16-bit byte swap all data before injecting it */
for (i=0; i< call->len; i+=2)
{
for (i = 0; i < call->len; i += 2) {
unsigned char Tmp = Data[i];
Data[i] = Data[i+1];
Data[i+1] = Tmp;
Data[i] = Data[i + 1];
Data[i + 1] = Tmp;
}
#endif
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, call->len, MPEG_AUDIO_PES_START_CODE/*PRIVATE_STREAM_1_PES_START_CODE*/, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, call->len,
MPEG_AUDIO_PES_START_CODE
/*PRIVATE_STREAM_1_PES_START_CODE */ , call->Pts,
0);
#ifdef DO_BYTESPWAP
iov[1].iov_base = Data;
#else

View File

@@ -90,37 +90,36 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
flac_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
flac_err("call data is NULL...\n");
return 0;
}
flac_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
flac_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
flac_err("file pointer < 0. ignoring ...\n");
return 0;
}
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, call->len , MPEG_AUDIO_PES_START_CODE, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, call->len, MPEG_AUDIO_PES_START_CODE,
call->Pts, 0);
iov[1].iov_base = call->data;
iov[1].iov_len = call->len;

View File

@@ -99,32 +99,29 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
int res = 0;
WriterFBCallData_t* call = (WriterFBCallData_t*) _call;
WriterFBCallData_t *call = (WriterFBCallData_t *) _call;
fb_printf(100, "\n");
if (!call)
{
if (!call) {
fb_err("call data is NULL...\n");
return 0;
}
if (!call->destination)
{
if (!call->destination) {
fb_err("frame buffer == NULL. ignoring ...\n");
return 0;
}
int dst_stride = call->destStride/sizeof(uint32_t);
int dst_stride = call->destStride / sizeof(uint32_t);
int dst_delta = dst_stride - call->Width;
uint32_t *dst = call->destination + call->y * dst_stride + call->x;
if (call->data)
{
if (call->data) {
int src_delta = call->Stride - call->Width;
unsigned char *src = call->data;
static uint32_t last_color = 0, colortable[256];
@@ -160,7 +157,8 @@ static int writeData(void* _call)
}
}
} else {
uint32_t *dst_final = dst + call->Width + call->Height * dst_stride;
uint32_t *dst_final =
dst + call->Width + call->Height * dst_stride;
for (; dst < dst_final; dst += dst_delta) {
uint32_t *dst_end = dst + call->Width;
for (; dst < dst_end; dst++)

View File

@@ -89,40 +89,42 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
int len = 0;
h263_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
h263_err("call data is NULL...\n");
return 0;
}
h263_printf(10, "VideoPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
h263_err("NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
h263_err("file pointer < 0. ignoring ...\n");
return 0;
}
int HeaderLength = InsertPesHeader(PesHeader, call->len, H263_VIDEO_PES_START_CODE, call->Pts,0);
int HeaderLength =
InsertPesHeader(PesHeader, call->len, H263_VIDEO_PES_START_CODE,
call->Pts, 0);
int PrivateHeaderLength = InsertVideoPrivateDataHeader (&PesHeader[HeaderLength], call->len);
int PrivateHeaderLength =
InsertVideoPrivateDataHeader(&PesHeader[HeaderLength], call->len);
int PesLength = PesHeader[PES_LENGTH_BYTE_0] + (PesHeader[PES_LENGTH_BYTE_1] << 8) + PrivateHeaderLength;
int PesLength =
PesHeader[PES_LENGTH_BYTE_0] +
(PesHeader[PES_LENGTH_BYTE_1] << 8) + PrivateHeaderLength;
PesHeader[PES_LENGTH_BYTE_0] = PesLength & 0xff;
PesHeader[PES_LENGTH_BYTE_1] = (PesLength >> 8) & 0xff;

View File

@@ -76,22 +76,22 @@ if (debug_level >= level) printf("[%s:%s] " fmt, FILENAME, __FUNCTION__, ## x);
/* ***************************** */
/* Types */
/* ***************************** */
typedef struct avcC_s
{
typedef struct avcC_s {
unsigned char Version; /* configurationVersion */
unsigned char Profile; /* AVCProfileIndication */
unsigned char Compatibility; /* profile_compatibility */
unsigned char Level; /* AVCLevelIndication */
unsigned char NalLengthMinusOne; /* held in bottom two bits */
unsigned char NumParamSets; /* held in bottom 5 bits */
unsigned char Params[1]; /* {length,params}{length,params}...sequence then picture*/
unsigned char Params[1]; /* {length,params}{length,params}...sequence then picture */
} avcC_t;
/* ***************************** */
/* Varaibles */
/* ***************************** */
const unsigned char Head[] = {0, 0, 0, 1};
const unsigned char Head[] = { 0, 0, 0, 1 };
static int initialHeader = 1;
static unsigned int NalLengthBytes = 1;
@@ -109,9 +109,9 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
unsigned long long int VideoPts;
@@ -122,8 +122,7 @@ static int writeData(void* _call)
struct iovec iov[128];
h264_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
h264_err("call data is NULL...\n");
return 0;
}
@@ -132,25 +131,28 @@ static int writeData(void* _call)
TimeScale = call->FrameScale;
VideoPts = call->Pts;
h264_printf(10, "VideoPts %lld - %d %d\n", call->Pts, TimeDelta, TimeScale);
h264_printf(10, "VideoPts %lld - %d %d\n", call->Pts, TimeDelta,
TimeScale);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
h264_err("NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
h264_err("file pointer < 0. ignoring ...\n");
return 0;
}
if((call->len > 3) && ((call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x00 && call->data[3] == 0x01) ||
(call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff)))
{
if ((call->len > 3)
&&
((call->data[0] == 0x00 && call->data[1] == 0x00
&& call->data[2] == 0x00 && call->data[3] == 0x01)
|| (call->data[0] == 0xff && call->data[1] == 0xff
&& call->data[2] == 0xff && call->data[3] == 0xff))) {
unsigned int PacketLength = 0;
unsigned int FakeStartCode = (call->Version << 8) | PES_VERSION_FAKE_START_CODE;
unsigned int FakeStartCode =
(call->Version << 8) | PES_VERSION_FAKE_START_CODE;
iov[ic++].iov_base = PesHeader;
if (initialHeader) {
initialHeader = 0;
@@ -166,13 +168,15 @@ static int writeData(void* _call)
by the player */
iov[ic].iov_base = "";
iov[ic++].iov_len = 1;
iov[0].iov_len = InsertPesHeader(PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, call->Pts, FakeStartCode);
iov[0].iov_len =
InsertPesHeader(PesHeader, PacketLength,
MPEG_VIDEO_PES_START_CODE, call->Pts,
FakeStartCode);
return writev(call->fd, iov, ic);
}
if (initialHeader)
{
avcC_t* avcCHeader = (avcC_t*)call->private_data;
if (initialHeader) {
avcC_t *avcCHeader = (avcC_t *) call->private_data;
unsigned int i;
unsigned int ParamSets;
unsigned int ParamOffset;
@@ -185,7 +189,8 @@ static int writeData(void* _call)
}
if (avcCHeader->Version != 1)
h264_err("Error unknown avcC version (%x). Expect problems.\n", avcCHeader->Version);
h264_err("Error unknown avcC version (%x). Expect problems.\n",
avcCHeader->Version);
ParametersLength = 0;
@@ -193,12 +198,13 @@ static int writeData(void* _call)
HeaderData[ParametersLength++] = 0x00; // Start code
HeaderData[ParametersLength++] = 0x00;
HeaderData[ParametersLength++] = 0x01;
HeaderData[ParametersLength++] = NALU_TYPE_PLAYER2_CONTAINER_PARAMETERS;
HeaderData[ParametersLength++] =
NALU_TYPE_PLAYER2_CONTAINER_PARAMETERS;
// Container message version - changes when/if we vary the format of the message
HeaderData[ParametersLength++] = CONTAINER_PARAMETERS_VERSION;
HeaderData[ParametersLength++] = 0xff; // Field separator
if( TimeDelta == 0xffffffff )
if (TimeDelta == 0xffffffff)
TimeDelta = (TimeScale > 1000) ? 1001 : 1;
HeaderData[ParametersLength++] = (TimeScale >> 24) & 0xff; // Output the timescale
@@ -220,7 +226,10 @@ static int writeData(void* _call)
ic = 0;
iov[ic].iov_base = PesHeader;
iov[ic++].iov_len = InsertPesHeader (PesHeader, ParametersLength, MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
iov[ic++].iov_len =
InsertPesHeader(PesHeader, ParametersLength,
MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE,
0);
iov[ic].iov_base = HeaderData;
iov[ic++].iov_len = ParametersLength;
len = writev(call->fd, iov, ic);
@@ -231,50 +240,66 @@ static int writeData(void* _call)
ParamSets = avcCHeader->NumParamSets & 0x1f;
h264_printf(20, "avcC contents:\n");
h264_printf(20, " version: %d\n", avcCHeader->Version);
h264_printf(20, " profile: %d\n", avcCHeader->Profile);
h264_printf(20, " profile compatibility: %d\n", avcCHeader->Compatibility);
h264_printf(20, " level: %d\n", avcCHeader->Level);
h264_printf(20, " nal length bytes: %d\n", NalLengthBytes);
h264_printf(20, " number of sequence param sets: %d\n", ParamSets);
h264_printf(20, " version: %d\n",
avcCHeader->Version);
h264_printf(20, " profile: %d\n",
avcCHeader->Profile);
h264_printf(20, " profile compatibility: %d\n",
avcCHeader->Compatibility);
h264_printf(20, " level: %d\n",
avcCHeader->Level);
h264_printf(20, " nal length bytes: %d\n",
NalLengthBytes);
h264_printf(20, " number of sequence param sets: %d\n",
ParamSets);
ParamOffset = 0;
ic = 0;
iov[ic++].iov_base = PesHeader;
for (i = 0; i < ParamSets; i++) {
unsigned int PsLength = (avcCHeader->Params[ParamOffset] << 8) + avcCHeader->Params[ParamOffset+1];
unsigned int PsLength =
(avcCHeader->Params[ParamOffset] << 8) +
avcCHeader->Params[ParamOffset + 1];
h264_printf(20, " sps %d has length %d\n", i, PsLength);
iov[ic].iov_base = (char *)Head;
iov[ic++].iov_len = sizeof(Head);
InitialHeaderLength += sizeof(Head);
iov[ic].iov_base = &avcCHeader->Params[ParamOffset+2];
iov[ic++].iov_len = PsLength;
InitialHeaderLength += PsLength;
ParamOffset += PsLength+2;
}
ParamSets = avcCHeader->Params[ParamOffset];
h264_printf(20, " number of picture param sets: %d\n", ParamSets);
ParamOffset++;
for (i = 0; i < ParamSets; i++) {
unsigned int PsLength = (avcCHeader->Params[ParamOffset] << 8) + avcCHeader->Params[ParamOffset+1];
h264_printf (20, " pps %d has length %d\n", i, PsLength);
h264_printf(20, " sps %d has length %d\n", i,
PsLength);
iov[ic].iov_base = (char *) Head;
iov[ic++].iov_len = sizeof(Head);
InitialHeaderLength += sizeof(Head);
iov[ic].iov_base = &avcCHeader->Params[ParamOffset+2];
iov[ic].iov_base = &avcCHeader->Params[ParamOffset + 2];
iov[ic++].iov_len = PsLength;
InitialHeaderLength += PsLength;
ParamOffset += PsLength+2;
ParamOffset += PsLength + 2;
}
iov[0].iov_len = InsertPesHeader (PesHeader, InitialHeaderLength, MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
ParamSets = avcCHeader->Params[ParamOffset];
h264_printf(20, " number of picture param sets: %d\n",
ParamSets);
ParamOffset++;
for (i = 0; i < ParamSets; i++) {
unsigned int PsLength =
(avcCHeader->Params[ParamOffset] << 8) +
avcCHeader->Params[ParamOffset + 1];
h264_printf(20, " pps %d has length %d\n", i,
PsLength);
iov[ic].iov_base = (char *) Head;
iov[ic++].iov_len = sizeof(Head);
InitialHeaderLength += sizeof(Head);
iov[ic].iov_base = &avcCHeader->Params[ParamOffset + 2];
iov[ic++].iov_len = PsLength;
InitialHeaderLength += PsLength;
ParamOffset += PsLength + 2;
}
iov[0].iov_len =
InsertPesHeader(PesHeader, InitialHeaderLength,
MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE,
0);
ssize_t l = writev(call->fd, iov, ic);
if (l < 0)
return l;
@@ -292,21 +317,35 @@ static int writeData(void* _call)
unsigned char NalData[4];
int NalPresent = 1;
memcpy (NalData, call->data + VideoPosition, NalLengthBytes);
memcpy(NalData, call->data + VideoPosition, NalLengthBytes);
VideoPosition += NalLengthBytes;
NalStart += NalLengthBytes;
switch(NalLengthBytes) {
case 1: NalLength = (NalData[0]); break;
case 2: NalLength = (NalData[0] << 8) | (NalData[1]); break;
case 3: NalLength = (NalData[0] << 16) | (NalData[1] << 8) | (NalData[2]); break;
default: NalLength = (NalData[0] << 24) | (NalData[1] << 16) | (NalData[2] << 8) | (NalData[3]); break;
switch (NalLengthBytes) {
case 1:
NalLength = (NalData[0]);
break;
case 2:
NalLength = (NalData[0] << 8) | (NalData[1]);
break;
case 3:
NalLength =
(NalData[0] << 16) | (NalData[1] << 8) | (NalData[2]);
break;
default:
NalLength =
(NalData[0] << 24) | (NalData[1] << 16) | (NalData[2] << 8)
| (NalData[3]);
break;
}
h264_printf(20, "NalStart = %u + NalLength = %u > SampleSize = %u\n", NalStart, NalLength, SampleSize);
h264_printf(20,
"NalStart = %u + NalLength = %u > SampleSize = %u\n",
NalStart, NalLength, SampleSize);
if (NalStart + NalLength > SampleSize) {
h264_printf(20, "nal length past end of buffer - size %u frame offset %u left %u\n",
NalLength, NalStart , SampleSize - NalStart );
h264_printf(20,
"nal length past end of buffer - size %u frame offset %u left %u\n",
NalLength, NalStart, SampleSize - NalStart);
NalStart = SampleSize;
} else {
@@ -316,7 +355,7 @@ static int writeData(void* _call)
if (NalPresent) {
NalPresent = 0;
iov[ic].iov_base = (char *)Head;
iov[ic].iov_base = (char *) Head;
iov[ic++].iov_len = sizeof(Head);
}
@@ -324,9 +363,11 @@ static int writeData(void* _call)
iov[ic++].iov_len = NalLength;
VideoPosition += NalLength;
h264_printf (20, " pts=%llu\n", VideoPts);
h264_printf(20, " pts=%llu\n", VideoPts);
iov[0].iov_len = InsertPesHeader (PesHeader, NalLength, MPEG_VIDEO_PES_START_CODE, VideoPts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, NalLength,
MPEG_VIDEO_PES_START_CODE, VideoPts, 0);
ssize_t l = writev(call->fd, iov, ic);
if (l < 0)
return l;
@@ -336,44 +377,41 @@ static int writeData(void* _call)
}
} while (NalStart < SampleSize);
if (len < 0)
{
if (len < 0) {
h264_err("error writing data errno = %d\n", errno);
h264_err("%s\n", strerror(errno));
}
h264_printf (10, "< len %d\n", len);
h264_printf(10, "< len %d\n", len);
return len;
}
static int writeReverseData(void* _call)
static int writeReverseData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
h264_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
h264_err("call data is NULL...\n");
return 0;
}
h264_printf(10, "VideoPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
h264_err("NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
h264_err("file pointer < 0. ignoring ...\n");
return 0;
}
return 0;
}
/* ***************************** */
/* Writer Definition */
/* ***************************** */

View File

@@ -72,24 +72,22 @@ void PutBits(BitPacker_t * ld, unsigned int code, unsigned int length)
#ifdef DEBUG_PUTBITS
if (ld->debug)
dprintf("code = %d, length = %d, bit_buf = 0x%x, bit_left = %d\n", code, length, bit_buf, bit_left);
dprintf("code = %d, length = %d, bit_buf = 0x%x, bit_left = %d\n",
code, length, bit_buf, bit_left);
#endif /* DEBUG_PUTBITS */
if (length < bit_left)
{
if (length < bit_left) {
/* fits into current buffer */
bit_buf = (bit_buf << length) | code;
bit_left -= length;
}
else
{
} else {
/* doesn't fit */
bit_buf <<= bit_left;
bit_buf |= code >> (length - bit_left);
ld->Ptr[0] = (char)(bit_buf >> 24);
ld->Ptr[1] = (char)(bit_buf >> 16);
ld->Ptr[2] = (char)(bit_buf >> 8);
ld->Ptr[3] = (char)bit_buf;
ld->Ptr[0] = (char) (bit_buf >> 24);
ld->Ptr[1] = (char) (bit_buf >> 16);
ld->Ptr[2] = (char) (bit_buf >> 8);
ld->Ptr[3] = (char) bit_buf;
ld->Ptr += 4;
length -= bit_left;
bit_buf = code & ((1 << length) - 1);
@@ -110,8 +108,7 @@ void PutBits(BitPacker_t * ld, unsigned int code, unsigned int length)
void FlushBits(BitPacker_t * ld)
{
ld->BitBuffer <<= ld->Remaining;
while (ld->Remaining < 32)
{
while (ld->Remaining < 32) {
#ifdef DEBUG_PUTBITS
if (ld->debug)
dprintf("flushing 0x%2.2x\n", ld->BitBuffer >> 24);

View File

@@ -90,37 +90,36 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
mp3_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
mp3_err("call data is NULL...\n");
return 0;
}
mp3_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
mp3_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
mp3_err("file pointer < 0. ignoring ...\n");
return 0;
}
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, call->len , MPEG_AUDIO_PES_START_CODE, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, call->len, MPEG_AUDIO_PES_START_CODE,
call->Pts, 0);
iov[1].iov_base = call->data;
iov[1].iov_len = call->len;

View File

@@ -91,9 +91,9 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
int len = 0;
@@ -101,37 +101,36 @@ static int writeData(void* _call)
mpeg2_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
mpeg2_err("call data is NULL...\n");
return 0;
}
mpeg2_printf(10, "VideoPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
mpeg2_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
mpeg2_err("file pointer < 0. ignoring ...\n");
return 0;
}
while(Position < call->len) {
while (Position < call->len) {
int PacketLength = (call->len - Position) <= MAX_PES_PACKET_SIZE ?
(call->len - Position) : MAX_PES_PACKET_SIZE;
int Remaining = call->len - Position - PacketLength;
mpeg2_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n", PacketLength, Remaining, Position);
mpeg2_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n",
PacketLength, Remaining, Position);
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, PacketLength, 0xe0, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, PacketLength, 0xe0, call->Pts, 0);
iov[1].iov_base = call->data + Position;
iov[1].iov_len = PacketLength;

View File

@@ -95,7 +95,7 @@ static const unsigned char clpcm_prv[14] = { 0xA0, //sub_stream_id
0, //bit shift on channel GR2, assignment
0x80, //dynamic range control
0, 0 //resvd for copyright management
};
};
static unsigned char lpcm_prv[14];
static unsigned char breakBuffer[8192];
@@ -109,13 +109,15 @@ static unsigned int breakBufferFillSize = 0;
/* MISC Functions */
/* ***************************** */
static int prepareClipPlay(int uNoOfChannels, int uSampleRate, int uBitsPerSample, int bLittleEndian __attribute__((unused)))
static int prepareClipPlay(int uNoOfChannels, int uSampleRate,
int uBitsPerSample, int bLittleEndian
__attribute__ ((unused)))
{
printf("rate: %d ch: %d bits: %d (%d bps)\n",
uSampleRate/*Format->dwSamplesPerSec*/,
uNoOfChannels/*Format->wChannels*/,
uBitsPerSample/*Format->wBitsPerSample*/,
(uBitsPerSample/*Format->wBitsPerSample*/ / 8)
uSampleRate /*Format->dwSamplesPerSec */ ,
uNoOfChannels /*Format->wChannels */ ,
uBitsPerSample /*Format->wBitsPerSample */ ,
(uBitsPerSample /*Format->wBitsPerSample */ / 8)
);
SubFrameLen = 0;
@@ -126,25 +128,32 @@ static int prepareClipPlay(int uNoOfChannels, int uSampleRate, int uBitsPerSampl
//figure out size of subframe
//and set up sample rate
switch(uSampleRate) {
case 48000: SubFrameLen = 40;
break;
case 96000: lpcm_prv[8] |= 0x10;
SubFrameLen = 80;
break;
case 192000: lpcm_prv[8] |= 0x20;
SubFrameLen = 160;
break;
case 44100: lpcm_prv[8] |= 0x80;
switch (uSampleRate) {
case 48000:
SubFrameLen = 40;
break;
case 88200: lpcm_prv[8] |= 0x90;
case 96000:
lpcm_prv[8] |= 0x10;
SubFrameLen = 80;
break;
case 176400: lpcm_prv[8] |= 0xA0;
case 192000:
lpcm_prv[8] |= 0x20;
SubFrameLen = 160;
break;
default: break;
case 44100:
lpcm_prv[8] |= 0x80;
SubFrameLen = 40;
break;
case 88200:
lpcm_prv[8] |= 0x90;
SubFrameLen = 80;
break;
case 176400:
lpcm_prv[8] |= 0xA0;
SubFrameLen = 160;
break;
default:
break;
}
SubFrameLen *= uNoOfChannels;
@@ -152,19 +161,20 @@ static int prepareClipPlay(int uNoOfChannels, int uSampleRate, int uBitsPerSampl
//rewrite PES size to have as many complete subframes per PES as we can
// FIXME: PES header size was hardcoded to 18 in previous code. Actual size returned by InsertPesHeader is 14.
SubFramesPerPES = ((2048 - 18) - sizeof(lpcm_prv))/SubFrameLen;
SubFramesPerPES = ((2048 - 18) - sizeof(lpcm_prv)) / SubFrameLen;
SubFrameLen *= SubFramesPerPES;
//set number of channels
lpcm_prv[10] = uNoOfChannels - 1;
switch(uBitsPerSample) {
switch (uBitsPerSample) {
case 24:
lpcm_prv[7] |= 0x20;
case 16:
break;
default:
printf("inappropriate bits per sample (%d) - must be 16 or 24\n",uBitsPerSample);
printf("inappropriate bits per sample (%d) - must be 16 or 24\n",
uBitsPerSample);
return 1;
}
@@ -177,9 +187,9 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
@@ -202,42 +212,45 @@ static int writeData(void* _call)
return 0;
}
pcmPrivateData_t* pcmPrivateData = (pcmPrivateData_t*)call->private_data;
pcmPrivateData_t *pcmPrivateData =
(pcmPrivateData_t *) call->private_data;
if (initialHeader) {
initialHeader = 0;
prepareClipPlay(pcmPrivateData->uNoOfChannels, pcmPrivateData->uSampleRate,
pcmPrivateData->uBitsPerSample, pcmPrivateData->bLittleEndian);
prepareClipPlay(pcmPrivateData->uNoOfChannels,
pcmPrivateData->uSampleRate,
pcmPrivateData->uBitsPerSample,
pcmPrivateData->bLittleEndian);
}
unsigned char * buffer = call->data;
unsigned char *buffer = call->data;
unsigned int size = call->len;
unsigned int n;
unsigned char * injectBuffer = (unsigned char *)malloc(SubFrameLen);
unsigned char *injectBuffer = (unsigned char *) malloc(SubFrameLen);
unsigned int pos;
for(pos = 0; pos < size; )
{
for (pos = 0; pos < size;) {
//printf("PCM %s - Position=%d\n", __FUNCTION__, pos);
if((size - pos) < SubFrameLen)
{
if ((size - pos) < SubFrameLen) {
breakBufferFillSize = size - pos;
memcpy(breakBuffer, &buffer[pos], sizeof(unsigned char) * breakBufferFillSize);
memcpy(breakBuffer, &buffer[pos],
sizeof(unsigned char) * breakBufferFillSize);
//printf("PCM %s - Unplayed=%d\n", __FUNCTION__, breakBufferFillSize);
break;
}
//get first PES's worth
if(breakBufferFillSize > 0)
{
memcpy(injectBuffer, breakBuffer, sizeof(unsigned char)*breakBufferFillSize);
memcpy(&injectBuffer[breakBufferFillSize], &buffer[pos], sizeof(unsigned char)*(SubFrameLen - breakBufferFillSize));
if (breakBufferFillSize > 0) {
memcpy(injectBuffer, breakBuffer,
sizeof(unsigned char) * breakBufferFillSize);
memcpy(&injectBuffer[breakBufferFillSize], &buffer[pos],
sizeof(unsigned char) * (SubFrameLen -
breakBufferFillSize));
pos += (SubFrameLen - breakBufferFillSize);
breakBufferFillSize = 0;
} else
{
memcpy(injectBuffer, &buffer[pos], sizeof(unsigned char)*SubFrameLen);
} else {
memcpy(injectBuffer, &buffer[pos],
sizeof(unsigned char) * SubFrameLen);
pos += SubFrameLen;
}
@@ -250,36 +263,38 @@ static int writeData(void* _call)
iov[2].iov_len = SubFrameLen;
//write the PCM data
if(pcmPrivateData->uBitsPerSample == 16) {
for(n=0; n<SubFrameLen; n+=2) {
if (pcmPrivateData->uBitsPerSample == 16) {
for (n = 0; n < SubFrameLen; n += 2) {
unsigned char tmp;
tmp=injectBuffer[n];
injectBuffer[n]=injectBuffer[n+1];
injectBuffer[n+1]=tmp;
tmp = injectBuffer[n];
injectBuffer[n] = injectBuffer[n + 1];
injectBuffer[n + 1] = tmp;
}
} else {
// 0 1 2 3 4 5 6 7 8 9 10 11
// A1c A1b A1a-B1c B1b B1a-A2c A2b A2a-B2c B2b B2a
// to A1a A1b B1a B1b.A2a A2b B2a B2b-A1c B1c A2c B2c
for(n=0; n<SubFrameLen; n+=12) {
for (n = 0; n < SubFrameLen; n += 12) {
unsigned char t, *p = &injectBuffer[n];
t = p[0];
p[ 0] = p[ 2];
p[ 2] = p[ 5];
p[ 5] = p[ 7];
p[ 7] = p[11];
p[11] = p[ 9];
p[ 9] = p[ 3];
p[ 3] = p[ 4];
p[ 4] = p[ 8];
p[ 8] = t;
p[0] = p[2];
p[2] = p[5];
p[5] = p[7];
p[7] = p[11];
p[11] = p[9];
p[9] = p[3];
p[3] = p[4];
p[4] = p[8];
p[8] = t;
}
}
//increment err... subframe count?
lpcm_prv[1] = ((lpcm_prv[1]+SubFramesPerPES) & 0x1F);
lpcm_prv[1] = ((lpcm_prv[1] + SubFramesPerPES) & 0x1F);
iov[0].iov_len = InsertPesHeader (PesHeader, iov[1].iov_len + iov[2].iov_len, PCM_PES_START_CODE, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, iov[1].iov_len + iov[2].iov_len,
PCM_PES_START_CODE, call->Pts, 0);
int len = writev(call->fd, iov, 3);
if (len < 0)
break;

View File

@@ -69,83 +69,82 @@
int InsertVideoPrivateDataHeader(unsigned char *data, int payload_size)
{
BitPacker_t ld2 = {data, 0, 32};
BitPacker_t ld2 = { data, 0, 32 };
int i;
PutBits (&ld2, PES_PRIVATE_DATA_FLAG, 8);
PutBits (&ld2, payload_size & 0xff, 8);
PutBits (&ld2, (payload_size >> 8) & 0xff, 8);
PutBits (&ld2, (payload_size >> 16) & 0xff, 8);
PutBits(&ld2, PES_PRIVATE_DATA_FLAG, 8);
PutBits(&ld2, payload_size & 0xff, 8);
PutBits(&ld2, (payload_size >> 8) & 0xff, 8);
PutBits(&ld2, (payload_size >> 16) & 0xff, 8);
for (i = 4; i < (PES_PRIVATE_DATA_LENGTH+1); i++)
PutBits (&ld2, 0, 8);
for (i = 4; i < (PES_PRIVATE_DATA_LENGTH + 1); i++)
PutBits(&ld2, 0, 8);
FlushBits (&ld2);
FlushBits(&ld2);
return PES_PRIVATE_DATA_LENGTH + 1;
}
int InsertPesHeader (unsigned char *data, int size, unsigned char stream_id, unsigned long long int pts, int pic_start_code)
int InsertPesHeader(unsigned char *data, int size, unsigned char stream_id,
unsigned long long int pts, int pic_start_code)
{
BitPacker_t ld2 = {data, 0, 32};
BitPacker_t ld2 = { data, 0, 32 };
if (size > MAX_PES_PACKET_SIZE)
size = 0; // unbounded
PutBits(&ld2,0x0 ,8);
PutBits(&ld2,0x0 ,8);
PutBits(&ld2,0x1 ,8); // Start Code
PutBits(&ld2,stream_id ,8); // Stream_id = Audio Stream
PutBits(&ld2, 0x0, 8);
PutBits(&ld2, 0x0, 8);
PutBits(&ld2, 0x1, 8); // Start Code
PutBits(&ld2, stream_id, 8); // Stream_id = Audio Stream
//4
PutBits(&ld2,size + 3 + (pts != INVALID_PTS_VALUE ? 5:0) + (pic_start_code ? (5) : 0),16); // PES_packet_length
PutBits(&ld2, size + 3 + (pts != INVALID_PTS_VALUE ? 5 : 0) + (pic_start_code ? (5) : 0), 16); // PES_packet_length
//6 = 4+2
PutBits(&ld2,0x2 ,2); // 10
PutBits(&ld2,0x0 ,2); // PES_Scrambling_control
PutBits(&ld2,0x0 ,1); // PES_Priority
PutBits(&ld2,0x0 ,1); // data_alignment_indicator
PutBits(&ld2,0x0 ,1); // Copyright
PutBits(&ld2,0x0 ,1); // Original or Copy
PutBits(&ld2, 0x2, 2); // 10
PutBits(&ld2, 0x0, 2); // PES_Scrambling_control
PutBits(&ld2, 0x0, 1); // PES_Priority
PutBits(&ld2, 0x0, 1); // data_alignment_indicator
PutBits(&ld2, 0x0, 1); // Copyright
PutBits(&ld2, 0x0, 1); // Original or Copy
//7 = 6+1
if (pts!=INVALID_PTS_VALUE)
PutBits(&ld2,0x2 ,2);
if (pts != INVALID_PTS_VALUE)
PutBits(&ld2, 0x2, 2);
else
PutBits(&ld2,0x0 ,2); // PTS_DTS flag
PutBits(&ld2, 0x0, 2); // PTS_DTS flag
PutBits(&ld2,0x0 ,1); // ESCR_flag
PutBits(&ld2,0x0 ,1); // ES_rate_flag
PutBits(&ld2,0x0 ,1); // DSM_trick_mode_flag
PutBits(&ld2,0x0 ,1); // additional_copy_ingo_flag
PutBits(&ld2,0x0 ,1); // PES_CRC_flag
PutBits(&ld2,0x0 ,1); // PES_extension_flag
PutBits(&ld2, 0x0, 1); // ESCR_flag
PutBits(&ld2, 0x0, 1); // ES_rate_flag
PutBits(&ld2, 0x0, 1); // DSM_trick_mode_flag
PutBits(&ld2, 0x0, 1); // additional_copy_ingo_flag
PutBits(&ld2, 0x0, 1); // PES_CRC_flag
PutBits(&ld2, 0x0, 1); // PES_extension_flag
//8 = 7+1
if (pts!=INVALID_PTS_VALUE)
PutBits(&ld2,0x5,8);
if (pts != INVALID_PTS_VALUE)
PutBits(&ld2, 0x5, 8);
else
PutBits(&ld2,0x0 ,8); // PES_header_data_length
PutBits(&ld2, 0x0, 8); // PES_header_data_length
//9 = 8+1
if (pts!=INVALID_PTS_VALUE)
{
PutBits(&ld2,0x2,4);
PutBits(&ld2,(pts>>30) & 0x7,3);
PutBits(&ld2,0x1,1);
PutBits(&ld2,(pts>>15) & 0x7fff,15);
PutBits(&ld2,0x1,1);
PutBits(&ld2,pts & 0x7fff,15);
PutBits(&ld2,0x1,1);
if (pts != INVALID_PTS_VALUE) {
PutBits(&ld2, 0x2, 4);
PutBits(&ld2, (pts >> 30) & 0x7, 3);
PutBits(&ld2, 0x1, 1);
PutBits(&ld2, (pts >> 15) & 0x7fff, 15);
PutBits(&ld2, 0x1, 1);
PutBits(&ld2, pts & 0x7fff, 15);
PutBits(&ld2, 0x1, 1);
}
//14 = 9+5
if (pic_start_code)
{
PutBits(&ld2,0x0 ,8);
PutBits(&ld2,0x0 ,8);
PutBits(&ld2,0x1 ,8); // Start Code
PutBits(&ld2,pic_start_code & 0xff ,8); // 00, for picture start
PutBits(&ld2,(pic_start_code >> 8 )&0xff,8); // For any extra information (like in mpeg4p2, the pic_start_code)
if (pic_start_code) {
PutBits(&ld2, 0x0, 8);
PutBits(&ld2, 0x0, 8);
PutBits(&ld2, 0x1, 8); // Start Code
PutBits(&ld2, pic_start_code & 0xff, 8); // 00, for picture start
PutBits(&ld2, (pic_start_code >> 8) & 0xff, 8); // For any extra information (like in mpeg4p2, the pic_start_code)
//14 + 4 = 18
}

View File

@@ -86,14 +86,14 @@ if (debug_level >= level) printf("[%s:%s] " fmt, FILENAME, __FUNCTION__, ## x);
/* Types */
/* ***************************** */
static const unsigned char SequenceLayerStartCode[] = {0x00, 0x00, 0x01, VC1_SEQUENCE_LAYER_METADATA_START_CODE};
static const unsigned char SequenceLayerStartCode[] =
{ 0x00, 0x00, 0x01, VC1_SEQUENCE_LAYER_METADATA_START_CODE };
static const unsigned char Metadata[] =
{
static const unsigned char Metadata[] = {
0x00, 0x00, 0x00, 0xc5,
0x04, 0x00, 0x00, 0x00,
0xc0, 0x00, 0x00, 0x00, /* Struct C set for for advanced profile*/
0xc0, 0x00, 0x00, 0x00, /* Struct C set for for advanced profile */
0x00, 0x00, 0x00, 0x00, /* Struct A */
0x00, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00,
@@ -122,9 +122,9 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
int len = 0;
@@ -154,7 +154,7 @@ static int writeData(void* _call)
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
unsigned char PesPayload[128];
unsigned char* PesPtr;
unsigned char *PesPtr;
unsigned int crazyFramerate = 0;
struct iovec iov[2];
@@ -169,10 +169,11 @@ static int writeData(void* _call)
PesPtr = PesPayload;
memcpy (PesPtr, SequenceLayerStartCode, sizeof(SequenceLayerStartCode));
memcpy(PesPtr, SequenceLayerStartCode,
sizeof(SequenceLayerStartCode));
PesPtr += sizeof(SequenceLayerStartCode);
memcpy (PesPtr, Metadata, sizeof(Metadata));
memcpy(PesPtr, Metadata, sizeof(Metadata));
PesPtr += METADATA_STRUCT_C_START;
PesPtr += WMV3_PRIVATE_DATA_LENGTH;
@@ -196,37 +197,49 @@ static int writeData(void* _call)
iov[0].iov_base = PesHeader;
iov[1].iov_base = PesPayload;
iov[1].iov_len = PesPtr - PesPayload;
iov[0].iov_len = InsertPesHeader (PesHeader, iov[1].iov_len, VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, iov[1].iov_len,
VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE,
0);
len = writev(call->fd, iov, 2);
/* For VC1 the codec private data is a standard vc1 sequence header so we just copy it to the output */
iov[0].iov_base = PesHeader;
iov[1].iov_base = call->private_data;
iov[1].iov_len = call->private_size;
iov[0].iov_len = InsertPesHeader (PesHeader, iov[1].iov_len, VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, iov[1].iov_len,
VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE,
0);
len = writev(call->fd, iov, 2);
initialHeader = 0;
}
if(call->len > 0 && call->data) {
if (call->len > 0 && call->data) {
unsigned int Position = 0;
unsigned char insertSampleHeader = 1;
while(Position < call->len) {
while (Position < call->len) {
int PacketLength = (call->len - Position) <= MAX_PES_PACKET_SIZE ?
(call->len - Position) : MAX_PES_PACKET_SIZE;
int PacketLength =
(call->len - Position) <=
MAX_PES_PACKET_SIZE ? (call->len -
Position) : MAX_PES_PACKET_SIZE;
int Remaining = call->len - Position - PacketLength;
vc1_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n", PacketLength, Remaining, Position);
vc1_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n",
PacketLength, Remaining, Position);
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
int HeaderLength = InsertPesHeader (PesHeader, PacketLength, VC1_VIDEO_PES_START_CODE, call->Pts, 0);
int HeaderLength =
InsertPesHeader(PesHeader, PacketLength,
VC1_VIDEO_PES_START_CODE, call->Pts, 0);
if(insertSampleHeader) {
const unsigned char Vc1FrameStartCode[] = {0, 0, 1, VC1_FRAME_START_CODE};
if (insertSampleHeader) {
const unsigned char Vc1FrameStartCode[] =
{ 0, 0, 1, VC1_FRAME_START_CODE };
/*
vc1_printf(10, "Data Start: {00 00 01 0d} - ");
@@ -235,11 +248,12 @@ static int writeData(void* _call)
vc1_printf(10, "\n");
*/
if (!FrameHeaderSeen && (call->len > 3) && (memcmp (call->data, Vc1FrameStartCode, 4) == 0))
if (!FrameHeaderSeen && (call->len > 3)
&& (memcmp(call->data, Vc1FrameStartCode, 4) == 0))
FrameHeaderSeen = 1;
if (!FrameHeaderSeen)
{
memcpy (&PesHeader[HeaderLength], Vc1FrameStartCode, sizeof(Vc1FrameStartCode));
if (!FrameHeaderSeen) {
memcpy(&PesHeader[HeaderLength], Vc1FrameStartCode,
sizeof(Vc1FrameStartCode));
HeaderLength += sizeof(Vc1FrameStartCode);
}
insertSampleHeader = 0;

View File

@@ -94,30 +94,27 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
int len = 0;
wma_printf(10, "\n");
if (call == NULL)
{
if (call == NULL) {
wma_err("call data is NULL...\n");
return 0;
}
wma_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0))
{
if ((call->data == NULL) || (call->len <= 0)) {
wma_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0)
{
if (call->fd < 0) {
wma_err("file pointer < 0. ignoring ...\n");
return 0;
}
@@ -126,8 +123,7 @@ static int writeData(void* _call)
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
if ((call->private_size <= 0) || (call->private_data == NULL))
{
if ((call->private_size <= 0) || (call->private_data == NULL)) {
wma_err("private NULL.\n");
return -1;
}
@@ -135,7 +131,9 @@ static int writeData(void* _call)
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, call->private_size, MPEG_AUDIO_PES_START_CODE, 0, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, call->private_size,
MPEG_AUDIO_PES_START_CODE, 0, 0);
iov[1].iov_base = call->private_data;
iov[1].iov_len = call->private_size;
@@ -144,14 +142,15 @@ static int writeData(void* _call)
initialHeader = 0;
}
if (len > -1 && call->len > 0 && call->data)
{
if (len > -1 && call->len > 0 && call->data) {
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
struct iovec iov[2];
iov[0].iov_base = PesHeader;
iov[0].iov_len = InsertPesHeader (PesHeader, call->len, MPEG_AUDIO_PES_START_CODE, call->Pts, 0);
iov[0].iov_len =
InsertPesHeader(PesHeader, call->len,
MPEG_AUDIO_PES_START_CODE, call->Pts, 0);
iov[1].iov_base = call->data;
iov[1].iov_len = call->len;

View File

@@ -82,19 +82,17 @@ if (debug_level >= level) printf("[%s:%s] " fmt, FILENAME, __FUNCTION__, ## x);
/* Types */
/* ***************************** */
typedef struct
{
typedef struct {
unsigned char privateData[WMV3_PRIVATE_DATA_LENGTH];
unsigned int width;
unsigned int height;
unsigned int framerate;
} awmv_t;
static const unsigned char Metadata[] =
{
static const unsigned char Metadata[] = {
0x00, 0x00, 0x00, 0xc5,
0x04, 0x00, 0x00, 0x00,
0xc0, 0x00, 0x00, 0x00, /* Struct C set for for advanced profile*/
0xc0, 0x00, 0x00, 0x00, /* Struct C set for for advanced profile */
0x00, 0x00, 0x00, 0x00, /* Struct A */
0x00, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00,
@@ -121,9 +119,9 @@ static int reset()
return 0;
}
static int writeData(void* _call)
static int writeData(void *_call)
{
WriterAVCallData_t* call = (WriterAVCallData_t*) _call;
WriterAVCallData_t *call = (WriterAVCallData_t *) _call;
awmv_t private_data;
int len = 0;
@@ -149,7 +147,9 @@ static int writeData(void* _call)
wmv_printf(10, "Got Private Size %d\n", call->private_size);
memcpy(private_data.privateData, call->private_data,
call->private_size>WMV3_PRIVATE_DATA_LENGTH?WMV3_PRIVATE_DATA_LENGTH:call->private_size);
call->private_size >
WMV3_PRIVATE_DATA_LENGTH ? WMV3_PRIVATE_DATA_LENGTH : call->
private_size);
private_data.width = call->Width;
private_data.height = call->Height;
@@ -157,8 +157,8 @@ static int writeData(void* _call)
#define PES_MIN_HEADER_SIZE 9
if (initialHeader) {
unsigned char PesPacket[PES_MIN_HEADER_SIZE+128];
unsigned char* PesPtr;
unsigned char PesPacket[PES_MIN_HEADER_SIZE + 128];
unsigned char *PesPtr;
unsigned int MetadataLength;
unsigned int crazyFramerate = 0;
@@ -171,10 +171,10 @@ static int writeData(void* _call)
PesPtr = &PesPacket[PES_MIN_HEADER_SIZE];
memcpy (PesPtr, Metadata, sizeof(Metadata));
memcpy(PesPtr, Metadata, sizeof(Metadata));
PesPtr += METADATA_STRUCT_C_START;
memcpy (PesPtr, private_data.privateData, WMV3_PRIVATE_DATA_LENGTH);
memcpy(PesPtr, private_data.privateData, WMV3_PRIVATE_DATA_LENGTH);
PesPtr += WMV3_PRIVATE_DATA_LENGTH;
/* Metadata Header Struct A */
@@ -196,42 +196,53 @@ static int writeData(void* _call)
MetadataLength = PesPtr - &PesPacket[PES_MIN_HEADER_SIZE];
int HeaderLength = InsertPesHeader (PesPacket, MetadataLength, VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
int HeaderLength =
InsertPesHeader(PesPacket, MetadataLength,
VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE,
0);
len = write(call->fd,PesPacket, HeaderLength + MetadataLength);
len = write(call->fd, PesPacket, HeaderLength + MetadataLength);
initialHeader = 0;
}
if(call->len > 0 && call->data) {
if (call->len > 0 && call->data) {
unsigned int Position = 0;
unsigned char insertSampleHeader = 1;
while(Position < call->len) {
while (Position < call->len) {
int PacketLength = (call->len - Position) <= MAX_PES_PACKET_SIZE ?
(call->len - Position) : MAX_PES_PACKET_SIZE;
int PacketLength =
(call->len - Position) <=
MAX_PES_PACKET_SIZE ? (call->len -
Position) : MAX_PES_PACKET_SIZE;
int Remaining = call->len - Position - PacketLength;
wmv_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n", PacketLength, Remaining, Position);
wmv_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n",
PacketLength, Remaining, Position);
unsigned char PesHeader[PES_MAX_HEADER_SIZE];
memset (PesHeader, '0', PES_MAX_HEADER_SIZE);
int HeaderLength = InsertPesHeader (PesHeader, PacketLength, VC1_VIDEO_PES_START_CODE, call->Pts, 0);
unsigned char* PacketStart;
memset(PesHeader, '0', PES_MAX_HEADER_SIZE);
int HeaderLength =
InsertPesHeader(PesHeader, PacketLength,
VC1_VIDEO_PES_START_CODE, call->Pts, 0);
unsigned char *PacketStart;
if(insertSampleHeader) {
if (insertSampleHeader) {
unsigned int PesLength;
unsigned int PrivateHeaderLength;
PrivateHeaderLength = InsertVideoPrivateDataHeader (&PesHeader[HeaderLength],
PrivateHeaderLength =
InsertVideoPrivateDataHeader(&PesHeader[HeaderLength],
call->len);
/* Update PesLength */
PesLength = PesHeader[PES_LENGTH_BYTE_0] +
(PesHeader[PES_LENGTH_BYTE_1] << 8) + PrivateHeaderLength;
(PesHeader[PES_LENGTH_BYTE_1] << 8) +
PrivateHeaderLength;
PesHeader[PES_LENGTH_BYTE_0] = PesLength & 0xff;
PesHeader[PES_LENGTH_BYTE_1] = (PesLength >> 8) & 0xff;
PesHeader[PES_HEADER_DATA_LENGTH_BYTE] += PrivateHeaderLength;
PesHeader[PES_HEADER_DATA_LENGTH_BYTE] +=
PrivateHeaderLength;
PesHeader[PES_FLAGS_BYTE] |= PES_EXTENSION_DATA_PRESENT;
HeaderLength += PrivateHeaderLength;
@@ -239,10 +250,12 @@ static int writeData(void* _call)
}
PacketStart = malloc(call->len + HeaderLength);
memcpy (PacketStart, PesHeader, HeaderLength);
memcpy (PacketStart + HeaderLength, call->data + Position, PacketLength);
memcpy(PacketStart, PesHeader, HeaderLength);
memcpy(PacketStart + HeaderLength, call->data + Position,
PacketLength);
len = write(call->fd, PacketStart, PacketLength + HeaderLength);
len =
write(call->fd, PacketStart, PacketLength + HeaderLength);
free(PacketStart);
Position += PacketLength;

View File

@@ -58,7 +58,7 @@ if (debug_level >= level) printf(x); } while (0)
/* Varaibles */
/* ***************************** */
static Writer_t * AvailableWriter[] = {
static Writer_t *AvailableWriter[] = {
&WriterAudioIPCM,
&WriterAudioPCM,
&WriterAudioMP3,
@@ -93,33 +93,33 @@ static Writer_t * AvailableWriter[] = {
/* Functions */
/* ***************************** */
Writer_t* getWriter(char* encoding)
Writer_t *getWriter(char *encoding)
{
int i;
for (i = 0; AvailableWriter[i] != NULL; i++)
{
if (strcmp(AvailableWriter[i]->caps->textEncoding, encoding) == 0)
{
writer_printf(50, "%s: found writer \"%s\" for \"%s\"\n", __func__, AvailableWriter[i]->caps->name, encoding);
for (i = 0; AvailableWriter[i] != NULL; i++) {
if (strcmp(AvailableWriter[i]->caps->textEncoding, encoding) == 0) {
writer_printf(50, "%s: found writer \"%s\" for \"%s\"\n",
__func__, AvailableWriter[i]->caps->name,
encoding);
return AvailableWriter[i];
}
}
writer_printf(1, "%s: no writer found for \"%s\"\n", __func__, encoding);
writer_printf(1, "%s: no writer found for \"%s\"\n", __func__,
encoding);
return NULL;
}
Writer_t* getDefaultVideoWriter()
Writer_t *getDefaultVideoWriter()
{
int i;
for (i = 0; AvailableWriter[i] != NULL; i++)
{
if (strcmp(AvailableWriter[i]->caps->textEncoding, "V_MPEG2") == 0)
{
writer_printf(50, "%s: found writer \"%s\"\n", __func__, AvailableWriter[i]->caps->name);
for (i = 0; AvailableWriter[i] != NULL; i++) {
if (strcmp(AvailableWriter[i]->caps->textEncoding, "V_MPEG2") == 0) {
writer_printf(50, "%s: found writer \"%s\"\n", __func__,
AvailableWriter[i]->caps->name);
return AvailableWriter[i];
}
}
@@ -129,15 +129,14 @@ Writer_t* getDefaultVideoWriter()
return NULL;
}
Writer_t* getDefaultAudioWriter()
Writer_t *getDefaultAudioWriter()
{
int i;
for (i = 0; AvailableWriter[i] != NULL; i++)
{
if (strcmp(AvailableWriter[i]->caps->textEncoding, "A_MP3") == 0)
{
writer_printf(50, "%s: found writer \"%s\"\n", __func__, AvailableWriter[i]->caps->name);
for (i = 0; AvailableWriter[i] != NULL; i++) {
if (strcmp(AvailableWriter[i]->caps->textEncoding, "A_MP3") == 0) {
writer_printf(50, "%s: found writer \"%s\"\n", __func__,
AvailableWriter[i]->caps->name);
return AvailableWriter[i];
}
}
@@ -147,16 +146,16 @@ Writer_t* getDefaultAudioWriter()
return NULL;
}
Writer_t* getDefaultFramebufferWriter()
Writer_t *getDefaultFramebufferWriter()
{
int i;
for (i = 0; AvailableWriter[i] != NULL; i++)
{
for (i = 0; AvailableWriter[i] != NULL; i++) {
writer_printf(10, "%s\n", AvailableWriter[i]->caps->textEncoding);
if (strcmp(AvailableWriter[i]->caps->textEncoding, "framebuffer") == 0)
{
writer_printf(50, "%s: found writer \"%s\"\n", __func__, AvailableWriter[i]->caps->name);
if (strcmp(AvailableWriter[i]->caps->textEncoding, "framebuffer")
== 0) {
writer_printf(50, "%s: found writer \"%s\"\n", __func__,
AvailableWriter[i]->caps->name);
return AvailableWriter[i];
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -34,13 +34,13 @@ extern PlaybackHandler_t PlaybackHandler;
extern ContainerHandler_t ContainerHandler;
extern ManagerHandler_t ManagerHandler;
Context_t * player = NULL;
Context_t *player = NULL;
/* ******************************************** */
/* Framebuffer for subtitle */
/* ******************************************** */
static int fd = -1;
static unsigned char* lfb = NULL;
static unsigned char *lfb = NULL;
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo screeninfo, oldscreen;
@@ -49,20 +49,21 @@ static int xRes = 0;
static int yRes = 0;
static int bpp = 0;
int kbhit(void) {
int kbhit(void)
{
struct timeval tv;
fd_set read_fd;
tv.tv_sec=1;
tv.tv_usec=0;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&read_fd);
FD_SET(0,&read_fd);
FD_SET(0, &read_fd);
if(select(1, &read_fd, NULL, NULL, &tv) == -1)
if (select(1, &read_fd, NULL, NULL, &tv) == -1)
return 0;
if(FD_ISSET(0,&read_fd))
if (FD_ISSET(0, &read_fd))
return 1;
return 0;
@@ -74,14 +75,12 @@ void framebuffer_init()
fd = open("/dev/fb0", O_RDWR);
if (fd < 0)
{
if (fd < 0) {
perror("/dev/fb0");
return;
}
if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo) < 0)
{
if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo) < 0) {
perror("FBIOGET_VSCREENINFO");
return;
}
@@ -90,10 +89,10 @@ void framebuffer_init()
ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo);
printf("mode %d, %d, %d\n", screeninfo.xres, screeninfo.yres, screeninfo.bits_per_pixel);
printf("mode %d, %d, %d\n", screeninfo.xres, screeninfo.yres,
screeninfo.bits_per_pixel);
if (ioctl(fd, FBIOGET_FSCREENINFO, &fix)<0)
{
if (ioctl(fd, FBIOGET_FSCREENINFO, &fix) < 0) {
perror("FBIOGET_FSCREENINFO");
printf("fb failed\n");
}
@@ -107,12 +106,13 @@ void framebuffer_init()
available = fix.smem_len;
printf("%dk video mem\n", available/1024);
printf("%dk video mem\n", available / 1024);
lfb = (unsigned char*) mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
lfb =
(unsigned char *) mmap(0, available, PROT_WRITE | PROT_READ,
MAP_SHARED, fd, 0);
if (lfb == NULL)
{
if (lfb == NULL) {
perror("mmap");
return;
}
@@ -121,33 +121,31 @@ void framebuffer_init()
}
int main(int argc,char* argv[]) {
int main(int argc, char *argv[])
{
SubtitleOutputDef_t out;
int showInfos = 0, noinput = 0;
char file[255] = {""};
char file[255] = { "" };
int speed = 0, speedmap = 0;
printf("%s >\n", __FILE__);
if (argc < 2)
{
if (argc < 2) {
printf("give me a filename please\n");
exit(1);
}
if (strstr(argv[1], "://") == NULL)
{
if (strstr(argv[1], "://") == NULL) {
strcpy(file, "file://");
}
strcat(file, argv[1]);
/* debug helper */
if(argc == 3 && !strcmp(argv[2], "-d"))
{
if (argc == 3 && !strcmp(argv[2], "-d")) {
showInfos = 1;
}
if(argc == 3 && !strcmp(argv[2], "-n"))
if (argc == 3 && !strcmp(argv[2], "-n"))
noinput = 1;
player = malloc(sizeof(Context_t));
@@ -160,33 +158,36 @@ int main(int argc,char* argv[]) {
printf("%s\n", player->output->Name);
//Registrating output devices
player->output->Command(player,OUTPUT_ADD, "audio");
player->output->Command(player,OUTPUT_ADD, "video");
player->output->Command(player,OUTPUT_ADD, "subtitle");
player->output->Command(player, OUTPUT_ADD, "audio");
player->output->Command(player, OUTPUT_ADD, "video");
player->output->Command(player, OUTPUT_ADD, "subtitle");
framebuffer_init();
/* for testing ass subtitles */
out.screen_width = xRes;
out.screen_height = yRes;
out.destination = (uint32_t *)lfb;
out.destination = (uint32_t *) lfb;
out.destStride = stride;
player->output->subtitle->Command(player, (OutputCmd_t)OUTPUT_SET_SUBTITLE_OUTPUT, (void*) &out);
player->output->subtitle->Command(player,
(OutputCmd_t)
OUTPUT_SET_SUBTITLE_OUTPUT,
(void *) &out);
if(player->playback->Command(player, PLAYBACK_OPEN, file) < 0)
if (player->playback->Command(player, PLAYBACK_OPEN, file) < 0)
return 10;
{
char ** TrackList = NULL;
char **TrackList = NULL;
player->manager->audio->Command(player, MANAGER_LIST, &TrackList);
if (TrackList != NULL) {
printf("AudioTrack List\n");
int i = 0;
for (i = 0; TrackList[i] != NULL; i+=2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i+1]);
for (i = 0; TrackList[i] != NULL; i += 2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]);
free(TrackList[i]);
free(TrackList[i+1]);
free(TrackList[i + 1]);
}
free(TrackList);
}
@@ -195,52 +196,65 @@ int main(int argc,char* argv[]) {
if (TrackList != NULL) {
printf("VideoTrack List\n");
int i = 0;
for (i = 0; TrackList[i] != NULL; i+=2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i+1]);
for (i = 0; TrackList[i] != NULL; i += 2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]);
free(TrackList[i]);
free(TrackList[i+1]);
free(TrackList[i + 1]);
}
free(TrackList);
}
player->manager->subtitle->Command(player, MANAGER_LIST, &TrackList);
player->manager->subtitle->Command(player, MANAGER_LIST,
&TrackList);
if (TrackList != NULL) {
printf("SubtitleTrack List\n");
int i = 0;
for (i = 0; TrackList[i] != NULL; i+=2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i+1]);
for (i = 0; TrackList[i] != NULL; i += 2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]);
free(TrackList[i]);
free(TrackList[i+1]);
free(TrackList[i + 1]);
}
free(TrackList);
}
}
{
int AudioTrackId = -1;
char * AudioTrackEncoding = NULL;
char * AudioTrackName = NULL;
player->manager->audio->Command(player, MANAGER_GET, &AudioTrackId);
player->manager->audio->Command(player, MANAGER_GETENCODING, &AudioTrackEncoding);
player->manager->audio->Command(player, MANAGER_GETNAME, &AudioTrackName);
printf("Current Audio Track : %d %s %s\n", AudioTrackId, AudioTrackEncoding, AudioTrackName);
char *AudioTrackEncoding = NULL;
char *AudioTrackName = NULL;
player->manager->audio->Command(player, MANAGER_GET,
&AudioTrackId);
player->manager->audio->Command(player, MANAGER_GETENCODING,
&AudioTrackEncoding);
player->manager->audio->Command(player, MANAGER_GETNAME,
&AudioTrackName);
printf("Current Audio Track : %d %s %s\n", AudioTrackId,
AudioTrackEncoding, AudioTrackName);
free(AudioTrackEncoding);
free(AudioTrackName);
AudioTrackEncoding = NULL;
AudioTrackName = NULL;
player->manager->video->Command(player, MANAGER_GET, &AudioTrackId);
player->manager->video->Command(player, MANAGER_GETENCODING, &AudioTrackEncoding);
player->manager->video->Command(player, MANAGER_GETNAME, &AudioTrackName);
printf("Current Video Track : %d %s %s\n", AudioTrackId, AudioTrackEncoding, AudioTrackName);
player->manager->video->Command(player, MANAGER_GET,
&AudioTrackId);
player->manager->video->Command(player, MANAGER_GETENCODING,
&AudioTrackEncoding);
player->manager->video->Command(player, MANAGER_GETNAME,
&AudioTrackName);
printf("Current Video Track : %d %s %s\n", AudioTrackId,
AudioTrackEncoding, AudioTrackName);
free(AudioTrackEncoding);
free(AudioTrackName);
AudioTrackEncoding = NULL;
AudioTrackName = NULL;
player->manager->subtitle->Command(player, MANAGER_GET, &AudioTrackId);
player->manager->subtitle->Command(player, MANAGER_GETENCODING, &AudioTrackEncoding);
player->manager->subtitle->Command(player, MANAGER_GETNAME, &AudioTrackName);
printf("Current Subtitle Track : %d %s %s\n", AudioTrackId, AudioTrackEncoding, AudioTrackName);
player->manager->subtitle->Command(player, MANAGER_GET,
&AudioTrackId);
player->manager->subtitle->Command(player, MANAGER_GETENCODING,
&AudioTrackEncoding);
player->manager->subtitle->Command(player, MANAGER_GETNAME,
&AudioTrackName);
printf("Current Subtitle Track : %d %s %s\n", AudioTrackId,
AudioTrackEncoding, AudioTrackName);
free(AudioTrackEncoding);
free(AudioTrackName);
AudioTrackEncoding = NULL;
@@ -250,16 +264,14 @@ int main(int argc,char* argv[]) {
player->manager->audio->Command(player, MANAGER_GET, &AudioTrackId);
player->manager->audio->Command(player, MANAGER_GETNAME, &AudioTrackName);
free(AudioTrackName);
AudioTrackName = NULL;*/
AudioTrackName = NULL; */
}
{
player->output->Command(player, OUTPUT_OPEN, NULL);
if (showInfos == 1)
{
char *tags[] =
{
if (showInfos == 1) {
char *tags[] = {
"Title",
"Artist",
"Album",
@@ -272,15 +284,14 @@ int main(int argc,char* argv[]) {
NULL
};
int i = 0;
while (tags[i] != NULL)
{
char* tag = tags[i];
while (tags[i] != NULL) {
char *tag = tags[i];
player->playback->Command(player, PLAYBACK_INFO, &tag);
#if !defined(VDR1722)
if (tag != NULL)
printf("\t%s:\t%s\n",tags[i], tag);
printf("\t%s:\t%s\n", tags[i], tag);
else
printf("\t%s:\tNULL\n",tags[i]);
printf("\t%s:\tNULL\n", tags[i]);
#endif
i++;
}
@@ -294,49 +305,60 @@ int main(int argc,char* argv[]) {
/*{
int pid = 0;
player->playback->Command(player, PLAYBACK_SWITCH_SUBTITLE, (void*)&pid);
}*/
} */
while(player->playback->isPlaying) {
while (player->playback->isPlaying) {
int Key = 0;
if(kbhit())
if(noinput == 0)
if (kbhit())
if (noinput == 0)
Key = getchar();
if(!player->playback->isPlaying) {
if (!player->playback->isPlaying) {
break;
}
if(Key == 0)
if (Key == 0)
continue;
switch (Key) {
case 'a': {
case 'a':{
int Key2 = getchar();
switch (Key2) {
case 'l': {
char ** TrackList = NULL;
player->manager->audio->Command(player, MANAGER_LIST, &TrackList);
case 'l':{
char **TrackList = NULL;
player->manager->audio->Command(player,
MANAGER_LIST,
&TrackList);
if (TrackList != NULL) {
printf("AudioTrack List\n");
int i = 0;
for (i = 0; TrackList[i] != NULL; i+=2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i+1]);
for (i = 0; TrackList[i] != NULL; i += 2) {
printf("\t%s - %s\n", TrackList[i],
TrackList[i + 1]);
free(TrackList[i]);
free(TrackList[i+1]);
free(TrackList[i + 1]);
}
free(TrackList);
}
break;
}
case 'c': {
case 'c':{
int AudioTrackId = -1;
char * AudioTrackEncoding = NULL;
char * AudioTrackName = NULL;
player->manager->audio->Command(player, MANAGER_GET, &AudioTrackId);
player->manager->audio->Command(player, MANAGER_GETENCODING, &AudioTrackEncoding);
player->manager->audio->Command(player, MANAGER_GETNAME, &AudioTrackName);
printf("Current Audio Track : %d %s %s\n", AudioTrackId, AudioTrackEncoding, AudioTrackName);
char *AudioTrackEncoding = NULL;
char *AudioTrackName = NULL;
player->manager->audio->Command(player,
MANAGER_GET,
&AudioTrackId);
player->manager->audio->Command(player,
MANAGER_GETENCODING,
&AudioTrackEncoding);
player->manager->audio->Command(player,
MANAGER_GETNAME,
&AudioTrackName);
printf("Current Audio Track : %d %s %s\n",
AudioTrackId, AudioTrackEncoding,
AudioTrackName);
free(AudioTrackEncoding);
free(AudioTrackName);
AudioTrackEncoding = NULL;
@@ -344,10 +366,12 @@ int main(int argc,char* argv[]) {
break;
}
default: {
default:{
Key2 -= 0x30;
if(Key2 >= 0 && Key2 <= 9) {
player->playback->Command(player, PLAYBACK_SWITCH_AUDIO, (void*)&Key2);
if (Key2 >= 0 && Key2 <= 9) {
player->playback->Command(player,
PLAYBACK_SWITCH_AUDIO,
(void *) &Key2);
}
}
@@ -355,32 +379,43 @@ int main(int argc,char* argv[]) {
break;
}
case 's': {
case 's':{
int Key2 = getchar();
switch (Key2) {
case 'l': {
char ** TrackList = NULL;
player->manager->subtitle->Command(player, MANAGER_LIST, &TrackList);
case 'l':{
char **TrackList = NULL;
player->manager->subtitle->Command(player,
MANAGER_LIST,
&TrackList);
if (TrackList != NULL) {
printf("SubtitleTrack List\n");
int i = 0;
for (i = 0; TrackList[i] != NULL; i+=2) {
printf("\t%s - %s\n", TrackList[i], TrackList[i+1]);
for (i = 0; TrackList[i] != NULL; i += 2) {
printf("\t%s - %s\n", TrackList[i],
TrackList[i + 1]);
free(TrackList[i]);
free(TrackList[i+1]);
free(TrackList[i + 1]);
}
free(TrackList);
}
break;
}
case 'c': {
case 'c':{
int SubtitleTrackId = -1;
char * SubtitleTrackEncoding = NULL;
char * SubtitleTrackName = NULL;
player->manager->subtitle->Command(player, MANAGER_GET, &SubtitleTrackId);
player->manager->subtitle->Command(player, MANAGER_GETENCODING, &SubtitleTrackEncoding);
player->manager->subtitle->Command(player, MANAGER_GETNAME, &SubtitleTrackName);
printf("Current Subtitle Track : %d %s %s\n", SubtitleTrackId, SubtitleTrackEncoding, SubtitleTrackName);
char *SubtitleTrackEncoding = NULL;
char *SubtitleTrackName = NULL;
player->manager->subtitle->Command(player,
MANAGER_GET,
&SubtitleTrackId);
player->manager->subtitle->Command(player,
MANAGER_GETENCODING,
&SubtitleTrackEncoding);
player->manager->subtitle->Command(player,
MANAGER_GETNAME,
&SubtitleTrackName);
printf("Current Subtitle Track : %d %s %s\n",
SubtitleTrackId, SubtitleTrackEncoding,
SubtitleTrackName);
free(SubtitleTrackEncoding);
free(SubtitleTrackName);
SubtitleTrackEncoding = NULL;
@@ -388,10 +423,12 @@ int main(int argc,char* argv[]) {
break;
}
default: {
default:{
Key2 -= 0x30;
if(Key2 >= 0 && Key2 <= 9) {
player->playback->Command(player, PLAYBACK_SWITCH_SUBTITLE, (void*)&Key2);
if (Key2 >= 0 && Key2 <= 9) {
player->playback->Command(player,
PLAYBACK_SWITCH_SUBTITLE,
(void *) &Key2);
}
}
@@ -412,7 +449,7 @@ int main(int argc,char* argv[]) {
player->playback->Command(player, PLAYBACK_PAUSE, NULL);
break;
case 'f': {
case 'f':{
if (speed < 0)
speed = 0;
@@ -422,22 +459,36 @@ int main(int argc,char* argv[]) {
if (speed > 7)
speed = 1;
switch(speed)
{
case 1: speedmap = 1; break;
case 2: speedmap = 3; break;
case 3: speedmap = 7; break;
case 4: speedmap = 15; break;
case 5: speedmap = 31; break;
case 6: speedmap = 63; break;
case 7: speedmap = 127; break;
}
player->playback->Command(player, PLAYBACK_FASTFORWARD, &speedmap);
switch (speed) {
case 1:
speedmap = 1;
break;
case 2:
speedmap = 3;
break;
case 3:
speedmap = 7;
break;
case 4:
speedmap = 15;
break;
case 5:
speedmap = 31;
break;
case 6:
speedmap = 63;
break;
case 7:
speedmap = 127;
break;
}
case 'b': {
player->playback->Command(player, PLAYBACK_FASTFORWARD,
&speedmap);
break;
}
case 'b':{
if (speed > 0)
speed = 0;
@@ -446,113 +497,157 @@ int main(int argc,char* argv[]) {
if (speed < -7)
speed = -1;
switch(speed)
{
case -1: speedmap = -5; break;
case -2: speedmap = -10; break;
case -3: speedmap = -20; break;
case -4: speedmap = -40; break;
case -5: speedmap = -80; break;
case -6: speedmap = -160; break;
case -7: speedmap = -320; break;
switch (speed) {
case -1:
speedmap = -5;
break;
case -2:
speedmap = -10;
break;
case -3:
speedmap = -20;
break;
case -4:
speedmap = -40;
break;
case -5:
speedmap = -80;
break;
case -6:
speedmap = -160;
break;
case -7:
speedmap = -320;
break;
}
player->playback->Command(player, PLAYBACK_FASTBACKWARD, &speedmap);
player->playback->Command(player,
PLAYBACK_FASTBACKWARD,
&speedmap);
break;
}
#if defined(VDR1722)
case 'g': {
char gotoString [256];
gets (gotoString);
case 'g':{
char gotoString[256];
gets(gotoString);
int gotoPos = atoi(gotoString);
double length = 0;
float sec;
printf("gotoPos %i\n", gotoPos);
if (player->container && player->container->selectedContainer)
player->container->selectedContainer->Command(player, CONTAINER_LENGTH, &length);
if (player->container
&& player->container->selectedContainer)
player->container->selectedContainer->
Command(player, CONTAINER_LENGTH, &length);
if(gotoPos <= 0){
if (gotoPos <= 0) {
printf("kleiner als erlaubt\n");
sec = 0.0;
}else if(gotoPos >= ((int)length - 10)){
} else if (gotoPos >= ((int) length - 10)) {
printf("laenger als erlaubt\n");
sec = (int)length - 10;
}else{
sec = (int) length - 10;
} else {
printf("normal action\n");
sec = gotoPos;
}
player->playback->Command(player, PLAYBACK_SEEK, (void*)&sec);
player->playback->Command(player, PLAYBACK_SEEK,
(void *) &sec);
printf("goto postion (%i sec)\n", sec);
break;
}
#endif
case 'k': {
case 'k':{
#if !defined(VDR1722)
int Key2 = getchar() - 48;
float sec=0.0;
float sec = 0.0;
printf("seconds %d \n", Key2);
switch (Key2) {
case 1: sec=-15.0;break;
case 4: sec=-60.0;break;
case 7: sec=-300.0;break;
case 3: sec= 15.0;break;
case 6: sec= 60.0;break;
case 9: sec= 300.0;break;
case 1:
sec = -15.0;
break;
case 4:
sec = -60.0;
break;
case 7:
sec = -300.0;
break;
case 3:
sec = 15.0;
break;
case 6:
sec = 60.0;
break;
case 9:
sec = 300.0;
break;
}
#else
char seek [256];
gets (seek);
char seek[256];
gets(seek);
unsigned int seekTo = atoi(seek);
double length = 0;
float sec;
unsigned long long int CurrentPTS = 0;
player->playback->Command(player, PLAYBACK_PTS, &CurrentPTS);
if (player->container && player->container->selectedContainer)
player->container->selectedContainer->Command(player, CONTAINER_LENGTH, &length);
player->playback->Command(player, PLAYBACK_PTS,
&CurrentPTS);
if (player->container
&& player->container->selectedContainer)
player->container->selectedContainer->
Command(player, CONTAINER_LENGTH, &length);
int CurrentSec = CurrentPTS / 90000;
printf("CurrentSec = %i, seekTo = %i, abs(seekTo) = %i seekTo + CurrentSec %i\n", CurrentSec, seekTo, abs(seekTo), (seekTo + CurrentSec));
printf
("CurrentSec = %i, seekTo = %i, abs(seekTo) = %i seekTo + CurrentSec %i\n",
CurrentSec, seekTo, abs(seekTo),
(seekTo + CurrentSec));
int ergSec = CurrentSec + seekTo;
if(ergSec < 0){
if (ergSec < 0) {
printf("kleiner als erlaubt\n");
sec = 0.0;
}else if((CurrentSec + seekTo) >= ((int)length - 10)){
} else if ((CurrentSec + seekTo) >=
((int) length - 10)) {
printf("laenger als erlaubt\n");
sec = (int)length - 10;
}else{
sec = (int) length - 10;
} else {
printf("normal action\n");
sec = seekTo + CurrentSec;
}
printf("springe %i \n", (int)sec);
printf("springe %i \n", (int) sec);
#endif
player->playback->Command(player, PLAYBACK_SEEK, (void*)&sec);
player->playback->Command(player, PLAYBACK_SEEK,
(void *) &sec);
break;
}
case 'l': {
case 'l':{
double length = 0;
if (player->container && player->container->selectedContainer)
player->container->selectedContainer->Command(player, CONTAINER_LENGTH, &length);
printf("Length = %02d:%02d:%02d (%.4f sec)\n", (int)((length/60)/60)%60, (int)(length/60)%60, (int)length%60, length);
if (player->container
&& player->container->selectedContainer)
player->container->selectedContainer->
Command(player, CONTAINER_LENGTH, &length);
printf("Length = %02d:%02d:%02d (%.4f sec)\n",
(int) ((length / 60) / 60) % 60,
(int) (length / 60) % 60, (int) length % 60,
length);
break;
}
case 'j': {
case 'j':{
unsigned long long int pts = 0;
player->playback->Command(player, PLAYBACK_PTS, &pts);
unsigned long long int sec = pts / 90000;
printf("Pts = %02d:%02d:%02d (%llu.0000 sec)\n", (int)((sec/60)/60)%60, (int)(sec/60)%60, (int)sec%60, sec);
printf("Pts = %02d:%02d:%02d (%llu.0000 sec)\n",
(int) ((sec / 60) / 60) % 60,
(int) (sec / 60) % 60, (int) sec % 60, sec);
break;
}
case 'i':
{
char *tags[] =
{
char *tags[] = {
"Title",
"Artist",
"Album",
@@ -565,20 +660,20 @@ int main(int argc,char* argv[]) {
NULL
};
int i = 0;
while (tags[i] != NULL)
{
char* tag = tags[i];
player->playback->Command(player, PLAYBACK_INFO, &tag);
while (tags[i] != NULL) {
char *tag = tags[i];
player->playback->Command(player, PLAYBACK_INFO,
&tag);
if (tag != NULL)
printf("\t%s:\t%s\n",tags[i], tag);
printf("\t%s:\t%s\n", tags[i], tag);
else
printf("\t%s:\tNULL\n",tags[i]);
printf("\t%s:\tNULL\n", tags[i]);
i++;
}
break;
}
default: {
default:{
printf("Control:\n");
printf("al: List audio tracks\n");
printf("ac: List current audio track\n");
@@ -589,8 +684,10 @@ int main(int argc,char* argv[]) {
printf("q: Stop\n");
printf("c: Continue\n");
printf("p: Pause\n");
printf("f: Increase speed (Fast forward) (stepwise)\n");
printf("b: Decrease speed (Fast reverse) (stepwise)\n");
printf
("f: Increase speed (Fast forward) (stepwise)\n");
printf
("b: Decrease speed (Fast reverse) (stepwise)\n");
printf("l: Print duration\n");
printf("j: Print current PTS\n");
printf("k[1,4,7]: Jump back [15,60,300] seconds\n");

View File

@@ -12,30 +12,30 @@
#include <libavutil/avutil.h>
#include <libavformat/avformat.h>
static AVFormatContext* avContext = NULL;
static AVFormatContext *avContext = NULL;
void dump_metadata()
{
AVDictionaryEntry *tag = NULL;
while ((tag = av_dict_get(avContext->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
while ((tag =
av_dict_get(avContext->metadata, "", tag,
AV_DICT_IGNORE_SUFFIX)))
printf("%s: %s\n", tag->key, tag->value);
}
int main(int argc,char* argv[])
int main(int argc, char *argv[])
{
char file[255] = {""};
char file[255] = { "" };
unsigned int i;
int err;
if (argc < 2)
{
if (argc < 2) {
printf("give me a filename please\n");
return -1;
}
if (strstr(argv[1], "://") == NULL)
{
if (strstr(argv[1], "://") == NULL) {
strcpy(file, "file://");
}
@@ -53,8 +53,7 @@ int main(int argc,char* argv[])
return -1;
}
if (avformat_find_stream_info(avContext, NULL) < 0)
{
if (avformat_find_stream_info(avContext, NULL) < 0) {
printf("Error avformat_find_stream_info\n");
}
@@ -62,15 +61,15 @@ int main(int argc,char* argv[])
dump_metadata();
printf("\nstream specific metadata:\n");
for (i = 0; i < avContext->nb_streams; i++)
{
AVStream* stream = avContext->streams[i];
for (i = 0; i < avContext->nb_streams; i++) {
AVStream *stream = avContext->streams[i];
if (stream)
{
if (stream) {
AVDictionaryEntry *tag = NULL;
if (stream->metadata != NULL)
while ((tag = av_dict_get(stream->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
while ((tag =
av_dict_get(stream->metadata, "", tag,
AV_DICT_IGNORE_SUFFIX)))
printf("%s: %s\n", tag->key, tag->value);
}
}