@ -794,7 +794,9 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *a
CopyRet rec_ret ;
CopyRet rec_ret ;
CHDContext * priv = avctx - > priv_data ;
CHDContext * priv = avctx - > priv_data ;
HANDLE dev = priv - > dev ;
HANDLE dev = priv - > dev ;
uint8_t * in_data = avpkt - > data ;
int len = avpkt - > size ;
int len = avpkt - > size ;
int free_data = 0 ;
uint8_t pic_type = 0 ;
uint8_t pic_type = 0 ;
av_log ( avctx , AV_LOG_VERBOSE , " CrystalHD: decode_frame \n " ) ;
av_log ( avctx , AV_LOG_VERBOSE , " CrystalHD: decode_frame \n " ) ;
@ -819,15 +821,14 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *a
int32_t tx_free = ( int32_t ) DtsTxFreeSize ( dev ) ;
int32_t tx_free = ( int32_t ) DtsTxFreeSize ( dev ) ;
if ( priv - > parser ) {
if ( priv - > parser ) {
uint8_t * in_data = avpkt - > data ;
int in_len = len ;
int ret = 0 ;
int ret = 0 ;
if ( priv - > bsfc ) {
if ( priv - > bsfc ) {
ret = av_bitstream_filter_filter ( priv - > bsfc , avctx , NULL ,
ret = av_bitstream_filter_filter ( priv - > bsfc , avctx , NULL ,
& in_data , & in_ len,
& in_data , & len ,
avpkt - > data , len , 0 ) ;
avpkt - > data , len , 0 ) ;
}
}
free_data = ret > 0 ;
if ( ret > = 0 ) {
if ( ret > = 0 ) {
uint8_t * pout ;
uint8_t * pout ;
@ -836,13 +837,13 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *a
H264Context * h = priv - > parser - > priv_data ;
H264Context * h = priv - > parser - > priv_data ;
index = av_parser_parse2 ( priv - > parser , avctx , & pout , & psize ,
index = av_parser_parse2 ( priv - > parser , avctx , & pout , & psize ,
in_data , in_ len, avctx - > pkt - > pts ,
in_data , len , avctx - > pkt - > pts ,
avctx - > pkt - > dts , 0 ) ;
avctx - > pkt - > dts , 0 ) ;
if ( index < 0 ) {
if ( index < 0 ) {
av_log ( avctx , AV_LOG_WARNING ,
av_log ( avctx , AV_LOG_WARNING ,
" CrystalHD: Failed to parse h.264 packet to "
" CrystalHD: Failed to parse h.264 packet to "
" detect interlacing. \n " ) ;
" detect interlacing. \n " ) ;
} else if ( index ! = in_ len) {
} else if ( index ! = len ) {
av_log ( avctx , AV_LOG_WARNING ,
av_log ( avctx , AV_LOG_WARNING ,
" CrystalHD: Failed to parse h.264 packet "
" CrystalHD: Failed to parse h.264 packet "
" completely. Interlaced frames may be "
" completely. Interlaced frames may be "
@ -859,9 +860,6 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *a
" packet. Interlaced frames may be incorrectly "
" packet. Interlaced frames may be incorrectly "
" detected. \n " ) ;
" detected. \n " ) ;
}
}
if ( ret > 0 ) {
av_freep ( & in_data ) ;
}
}
}
if ( len < tx_free - 1024 ) {
if ( len < tx_free - 1024 ) {
@ -876,11 +874,17 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *a
*/
*/
uint64_t pts = opaque_list_push ( priv , avctx - > pkt - > pts , pic_type ) ;
uint64_t pts = opaque_list_push ( priv , avctx - > pkt - > pts , pic_type ) ;
if ( ! pts ) {
if ( ! pts ) {
if ( free_data ) {
av_freep ( & in_data ) ;
}
return AVERROR ( ENOMEM ) ;
return AVERROR ( ENOMEM ) ;
}
}
av_log ( priv - > avctx , AV_LOG_VERBOSE ,
av_log ( priv - > avctx , AV_LOG_VERBOSE ,
" input \" pts \" : % " PRIu64 " \n " , pts ) ;
" input \" pts \" : % " PRIu64 " \n " , pts ) ;
ret = DtsProcInput ( dev , avpkt - > data , len , pts , 0 ) ;
ret = DtsProcInput ( dev , in_data , len , pts , 0 ) ;
if ( free_data ) {
av_freep ( & in_data ) ;
}
if ( ret = = BC_STS_BUSY ) {
if ( ret = = BC_STS_BUSY ) {
av_log ( avctx , AV_LOG_WARNING ,
av_log ( avctx , AV_LOG_WARNING ,
" CrystalHD: ProcInput returned busy \n " ) ;
" CrystalHD: ProcInput returned busy \n " ) ;