mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-30 19:32:13 +00:00
Add support for parsing and decoding DCA-HD streams.
Originally committed as revision 15951 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
d33ee3f2b1
commit
d041a59897
@ -1175,8 +1175,9 @@ static int dca_convert_bitstream(const uint8_t * src, int src_size, uint8_t * ds
|
|||||||
PutBitContext pb;
|
PutBitContext pb;
|
||||||
|
|
||||||
if((unsigned)src_size > (unsigned)max_size) {
|
if((unsigned)src_size > (unsigned)max_size) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Input frame size larger then DCA_MAX_FRAME_SIZE!\n");
|
// av_log(NULL, AV_LOG_ERROR, "Input frame size larger then DCA_MAX_FRAME_SIZE!\n");
|
||||||
return -1;
|
// return -1;
|
||||||
|
src_size = max_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
mrk = AV_RB32(src);
|
mrk = AV_RB32(src);
|
||||||
|
@ -31,4 +31,7 @@
|
|||||||
#define DCA_MARKER_14B_BE 0x1FFFE800
|
#define DCA_MARKER_14B_BE 0x1FFFE800
|
||||||
#define DCA_MARKER_14B_LE 0xFF1F00E8
|
#define DCA_MARKER_14B_LE 0xFF1F00E8
|
||||||
|
|
||||||
|
/** DCA-HD specific block starts with this marker. */
|
||||||
|
#define DCA_HD_MARKER 0x64582025
|
||||||
|
|
||||||
#endif /* AVCODEC_DCA_H */
|
#endif /* AVCODEC_DCA_H */
|
||||||
|
@ -34,6 +34,7 @@ typedef struct DCAParseContext {
|
|||||||
uint32_t lastmarker;
|
uint32_t lastmarker;
|
||||||
int size;
|
int size;
|
||||||
int framesize;
|
int framesize;
|
||||||
|
int hd_pos;
|
||||||
} DCAParseContext;
|
} DCAParseContext;
|
||||||
|
|
||||||
#define IS_MARKER(state, i, buf, buf_size) \
|
#define IS_MARKER(state, i, buf, buf_size) \
|
||||||
@ -75,10 +76,16 @@ static int dca_find_frame_end(DCAParseContext * pc1, const uint8_t * buf,
|
|||||||
for (; i < buf_size; i++) {
|
for (; i < buf_size; i++) {
|
||||||
pc1->size++;
|
pc1->size++;
|
||||||
state = (state << 8) | buf[i];
|
state = (state << 8) | buf[i];
|
||||||
if (state == pc1->lastmarker && IS_MARKER(state, i, buf, buf_size) && (!pc1->framesize || pc1->framesize == pc1->size)) {
|
if (state == DCA_HD_MARKER && !pc1->hd_pos)
|
||||||
|
pc1->hd_pos = pc1->size;
|
||||||
|
if (state == pc1->lastmarker && IS_MARKER(state, i, buf, buf_size)) {
|
||||||
|
if(pc1->framesize > pc1->size)
|
||||||
|
continue;
|
||||||
|
if(!pc1->framesize){
|
||||||
|
pc1->framesize = pc1->hd_pos ? pc1->hd_pos : pc1->size;
|
||||||
|
}
|
||||||
pc->frame_start_found = 0;
|
pc->frame_start_found = 0;
|
||||||
pc->state = -1;
|
pc->state = -1;
|
||||||
pc1->framesize = pc1->size;
|
|
||||||
pc1->size = 0;
|
pc1->size = 0;
|
||||||
return i - 3;
|
return i - 3;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user