mirror of
https://github.com/owntone/owntone-server.git
synced 2025-01-24 13:13:17 -05:00
Fixes for transcoding flacs with leading id3v2 tags
This commit is contained in:
parent
55793d6c32
commit
0725c9ae13
@ -18,6 +18,20 @@
|
|||||||
#include <avformat.h>
|
#include <avformat.h>
|
||||||
|
|
||||||
#include "ff-plugins.h"
|
#include "ff-plugins.h"
|
||||||
|
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
|
||||||
|
# define _PACKED __attribute((packed))
|
||||||
|
#else
|
||||||
|
# define _PACKED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct tag_scan_id3header {
|
||||||
|
unsigned char id[3];
|
||||||
|
unsigned char version[2];
|
||||||
|
unsigned char flags;
|
||||||
|
unsigned char size[4];
|
||||||
|
} _PACKED SCAN_ID3HEADER;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
# define TRUE 1
|
# define TRUE 1
|
||||||
@ -158,6 +172,8 @@ int ssc_ffmpeg_open(void *vp, char *file, char *codec, int duration) {
|
|||||||
WCHAR utf16_path[_MAX_PATH+1];
|
WCHAR utf16_path[_MAX_PATH+1];
|
||||||
WCHAR utf16_mode[3];
|
WCHAR utf16_mode[3];
|
||||||
#endif
|
#endif
|
||||||
|
SCAN_ID3HEADER id3;
|
||||||
|
unsigned int size = 0;
|
||||||
|
|
||||||
if(!handle)
|
if(!handle)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -203,6 +219,30 @@ int ssc_ffmpeg_open(void *vp, char *file, char *codec, int duration) {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check to see if there is an id3 tag there... if so, skip it. */
|
||||||
|
if(fread((unsigned char *)&id3,1,sizeof(id3),handle->fin) != sizeof(id3)) {
|
||||||
|
if(ferror(handle->fin)) {
|
||||||
|
_ppi->log(E_LOG,"Error reading file: %s\n",file);
|
||||||
|
} else {
|
||||||
|
_ppi->log(E_LOG,"Short file: %s\n",file);
|
||||||
|
}
|
||||||
|
handle->errnum = SSC_FFMPEG_E_FILEOPEN;
|
||||||
|
fclose(handle->fin);
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strncmp(id3.id,"ID3",3)==0) {
|
||||||
|
/* found an ID3 header... */
|
||||||
|
_ppi->log(E_DBG,"Found ID3 header\n");
|
||||||
|
size = (id3.size[0] << 21 | id3.size[1] << 14 |
|
||||||
|
id3.size[2] << 7 | id3.size[3]);
|
||||||
|
fseek(handle->fin,size + sizeof(SCAN_ID3HEADER),SEEK_SET);
|
||||||
|
_ppi->log(E_DBG,"Header length: %d\n",size);
|
||||||
|
} else {
|
||||||
|
fseek(handle->fin,0,SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user