diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 9ff67bd1bd2cc2d9bc2d853cf00e870ec36cb33a..c6b17a2021c66f8f622d66dd15fb8ec7adbe6926 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -62,6 +62,7 @@ static const char avi_headers[][8] = {
     { 'R', 'I', 'F', 'F',    'A', 'V', 'I', 'X' },
     { 'R', 'I', 'F', 'F',    'A', 'V', 'I', 0x19},
     { 'O', 'N', '2', ' ',    'O', 'N', '2', 'f' },
+    { 'R', 'I', 'F', 'F',    'A', 'M', 'V', ' ' },
     { 0 }
 };
 
@@ -232,6 +233,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
     AVStream *st;
     AVIStream *ast = NULL;
     char str_track[4];
+    int avih_width=0, avih_height=0;
+    int amv_file_format=0;
 
     avi->stream_index= -1;
 
@@ -276,6 +279,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
             avi->is_odml = 1;
             url_fskip(pb, size + (size & 1));
             break;
+        case MKTAG('a', 'm', 'v', 'h'):
+            amv_file_format=1;
         case MKTAG('a', 'v', 'i', 'h'):
             /* avi header */
             /* using frame_period is bad idea */
@@ -286,8 +291,11 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
             url_fskip(pb, 2 * 4);
             get_le32(pb);
+            get_le32(pb);
+            avih_width=get_le32(pb);
+            avih_height=get_le32(pb);
 
-            url_fskip(pb, size - 7 * 4);
+            url_fskip(pb, size - 10 * 4);
             break;
         case MKTAG('s', 't', 'r', 'h'):
             /* stream header */
@@ -309,6 +317,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
                     goto fail;
                 st->priv_data = ast;
             }
+            if(amv_file_format)
+                tag1 = stream_index ? MKTAG('a','u','d','s') : MKTAG('v','i','d','s');
 
 #ifdef DEBUG
             print_tag("strh", tag1, -1);
@@ -416,6 +426,14 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
                 st = s->streams[stream_index];
                 switch(codec_type) {
                 case CODEC_TYPE_VIDEO:
+                    if(amv_file_format){
+                        st->codec->width=avih_width;
+                        st->codec->height=avih_height;
+                        st->codec->codec_type = CODEC_TYPE_VIDEO;
+                        st->codec->codec_id = CODEC_ID_AMV;
+                        url_fskip(pb, size);
+                        break;
+                    }
                     get_le32(pb); /* size */
                     st->codec->width = get_le32(pb);
                     st->codec->height = get_le32(pb);
@@ -486,6 +504,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
                         st->codec->codec_id  = CODEC_ID_XAN_DPCM;
                         st->codec->codec_tag = 0;
                     }
+                    if (amv_file_format)
+                        st->codec->codec_id  = CODEC_ID_ADPCM_IMA_AMV;
                     break;
                 default:
                     st->codec->codec_type = CODEC_TYPE_DATA;