summaryrefslogtreecommitdiff
path: root/libavcodec/vc1.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-05-30 00:09:00 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-05-30 00:09:00 +0000
commit2d05bc86418681905f85ff7c621457756397a2ae (patch)
treeefc7f9520d43a26c36b028eb7abb983c8e991cb7 /libavcodec/vc1.c
parentf2264fa531ff3050141490028d35dde424ed2d22 (diff)
set pict_type in VC-1 parser, fix some timestamps problems
Originally committed as revision 18987 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vc1.c')
-rw-r--r--libavcodec/vc1.c60
1 files changed, 14 insertions, 46 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 82bf8db0de..8d79c18172 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -805,10 +805,8 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
* @param gb GetBit context initialized from Codec context extra_data
* @return Status
*/
-static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
+int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
{
- VC1Context *v = avctx->priv_data;
-
av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32));
v->profile = get_bits(gb, 2);
if (v->profile == PROFILE_COMPLEX)
@@ -1025,9 +1023,8 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
return 0;
}
-static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb)
+int vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
{
- VC1Context *v = avctx->priv_data;
int i;
av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
@@ -1074,7 +1071,7 @@ static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb)
return 0;
}
-static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
+int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
{
int pqindex, lowquant, status;
@@ -1101,6 +1098,9 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
skip_bits(gb, 7); // skip buffer fullness
+ if(v->parse_only)
+ return 0;
+
/* calculate RND */
if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
v->rnd = 1;
@@ -1286,7 +1286,7 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
return 0;
}
-static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
+int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
{
int pqindex, lowquant;
int status;
@@ -1362,6 +1362,9 @@ static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
+ if(v->parse_only)
+ return 0;
+
switch(v->s.pict_type) {
case FF_I_TYPE:
case FF_BI_TYPE:
@@ -3915,41 +3918,6 @@ static void vc1_decode_blocks(VC1Context *v)
}
}
-/** Find VC-1 marker in buffer
- * @return position where next marker starts or end of buffer if no marker found
- */
-static av_always_inline const uint8_t* find_next_marker(const uint8_t *src, const uint8_t *end)
-{
- uint32_t mrk = 0xFFFFFFFF;
-
- if(end-src < 4) return end;
- while(src < end){
- mrk = (mrk << 8) | *src++;
- if(IS_MARKER(mrk))
- return src-4;
- }
- return end;
-}
-
-static av_always_inline int vc1_unescape_buffer(const uint8_t *src, int size, uint8_t *dst)
-{
- int dsize = 0, i;
-
- if(size < 4){
- for(dsize = 0; dsize < size; dsize++) *dst++ = *src++;
- return size;
- }
- for(i = 0; i < size; i++, src++) {
- if(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) {
- dst[dsize++] = src[1];
- src++;
- i++;
- } else
- dst[dsize++] = *src;
- }
- return dsize;
-}
-
/** Initialize a VC1/WMV3 decoder
* @todo TODO: Handle VC-1 IDUs (Transport level?)
* @todo TODO: Decypher remaining bits in extra_data
@@ -3991,7 +3959,7 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
- if (decode_sequence_header(avctx, &gb) < 0)
+ if (vc1_decode_sequence_header(avctx, v, &gb) < 0)
return -1;
count = avctx->extradata_size*8 - get_bits_count(&gb);
@@ -4028,14 +3996,14 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
init_get_bits(&gb, buf2, buf2_size * 8);
switch(AV_RB32(start)){
case VC1_CODE_SEQHDR:
- if(decode_sequence_header(avctx, &gb) < 0){
+ if(vc1_decode_sequence_header(avctx, v, &gb) < 0){
av_free(buf2);
return -1;
}
seq_initialized = 1;
break;
case VC1_CODE_ENTRYPOINT:
- if(decode_entry_point(avctx, &gb) < 0){
+ if(vc1_decode_entry_point(avctx, v, &gb) < 0){
av_free(buf2);
return -1;
}
@@ -4150,7 +4118,7 @@ static int vc1_decode_frame(AVCodecContext *avctx,
case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
init_get_bits(&s->gb, buf2, buf_size2*8);
- decode_entry_point(avctx, &s->gb);
+ vc1_decode_entry_point(avctx, v, &s->gb);
break;
case VC1_CODE_SLICE:
av_log(avctx, AV_LOG_ERROR, "Sliced decoding is not implemented (yet)\n");