[FFmpeg-devel] Added support for XV video files

Shivam Goyal shivgo at iitk.ac.in
Mon Mar 25 12:49:37 EET 2019


On 3/25/19 3:59 PM, Michael Niedermayer wrote:
> On Sun, Mar 24, 2019 at 04:35:40PM +0530, Shivam Goyal wrote:
>> The attached patch is for ticket #3720
>>
>>      https://trac.ffmpeg.org/ticket/3720
>>
>> I have tested this demuxer on the files 1.xv and 5.xv attached with the
>> ticket
>>
>> http://samples.ffmpeg.org/ffmpeg-bugs/trac/ticket3720/
>>
>>
>>   It is working on both of these files.
>>
>> As XV video files are flv files with some encrypted data. These can be
>> converted to flv without loosing video quality (and it would be really
>> fast). I have also tried this and it is working "ffmpeg -i 1.xv -c copy
>> converted.flv".
>>
>>
>> Please suggest any improvements
>>
>>
> [...]
>
>> diff --git a/libavformat/xvtools.h b/libavformat/xvtools.h
>> new file mode 100644
>> index 0000000000..42c2c65c46
>> --- /dev/null
>> +++ b/libavformat/xvtools.h
>> @@ -0,0 +1,95 @@
>> +int flvid = 0x46;
>> +
>> +
>> +int byte_shift(int byte,int shift);
>> +int find_rot(AVIOContext *pb);
>> +int xvio_r8(AVIOContext *pb, int rot);
>> +unsigned int xvio_rb16(AVIOContext *s, int rot);
>> +unsigned int xvio_rb24(AVIOContext *s, int rot);
>> +unsigned int xvio_rb32(AVIOContext *s, int rot);
>> +uint64_t xvio_rb64(AVIOContext *s, int rot);
>> +int xv_string_decrypt(int64_t curr_pos, char *buffer, int length, int rot);
>> +
>> +
>> +
>> +int byte_shift(int byte,int shift){
>> +    return ((byte + shift)&0xff);
>> +}
>> +
>> +
>> +int find_rot(AVIOContext *pb){
>> +    int64_t curr_pos = avio_tell(pb);
>> +    avio_seek(pb,0x200000,SEEK_SET);
>> +    int rot = flvid - avio_r8(pb);
>> +    avio_seek(pb,curr_pos, SEEK_SET);
>> +    return rot;
>> +}
>> +
>> +
>> +
>> +int xvio_r8(AVIOContext *pb, int rot){
>> +    int64_t curr_pos = avio_tell(pb);
>> +    if(curr_pos < 0x200400){
>> +        int ret=avio_r8(pb);
>> +        if(ret == 0)return 0;
>> +        ret = byte_shift(ret,rot);
>> +        return ret;
>> +    }
>> +    int ret=avio_r8(pb);
>> +    return ret;
>> +}
> There is so much wrong with this code
> global variables are not ok in a demuxer that can have multiple instances
> global variables do not belong in headers either
> also non static inline functions do not belong in headers
>
> this xvio stuff all looks like a bad idea.
> Do i guess correctly that this fileformat is flv but scrambled at the IO
> layer ?
> if this is true it may be possible to implement a xv demuxer as a
> descrambler which than passes the data on to a unchanged flv demuxer.
> If that how this xv fundamentally works then that would be much
> cleaner.
> Also theflv demuxer duplication is not ok

Yeah The XV file is a flv file which starts from 0x200000 byte and its 
_next__0x400_ bytes are encrypted by something like caesar cipher (the 
bytes after 0x200400 till the end of the file are not encrypted) . So, 
Please suggest what would be best solution for this situation and how 
can i change this.

     Thank you, Shivam Goyal


>
>
>> +
>> +
>> +unsigned int xvio_rb16(AVIOContext *s, int rot)
>> +{
>> +    unsigned int val;
>> +    val = xvio_r8(s, rot) << 8;
>> +    val |= xvio_r8(s, rot);
>> +    return val;
>> +}
>> +
>> +
>> +unsigned int xvio_rb24(AVIOContext *s, int rot)
>> +{
>> +    unsigned int val;
>> +    val = xvio_rb16(s, rot) << 8;
>> +    val |= xvio_r8(s, rot);
>> +    return val;
>> +}
>> +
>> +
>> +unsigned int xvio_rb32(AVIOContext *s, int rot)
>> +{
>> +    unsigned int val;
>> +    val = xvio_rb16(s, rot) << 16;
>> +    val |= xvio_rb16(s, rot);
>> +    return val;
>> +}
>> +
>> +
>> +uint64_t xvio_rb64(AVIOContext *s, int rot)
>> +{
>> +    uint64_t val;
>> +    val = (uint64_t)xvio_rb32(s, rot) << 32;
>> +    val |= (uint64_t)xvio_rb32(s, rot);
>> +    return val;
>> +}
>> +
>> +
>> +
>> +int xv_string_decrypt(int64_t curr_pos, char *buffer, int length, int rot){
>> +    if(curr_pos>=0x200400){
>> +        return 0;
>> +    }
>> +    for(int i=0;i<length;i++){
>> +        if((curr_pos+i) < 0x200400){
>> +            buffer[i] = byte_shift(buffer[i],rot);
>> +        }
>> +        else{
>> +            break;
>> +        }
>> +    }
>> +    return 0;
>> +}
>> +
>> +
>> -- 
>> 2.21.0
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list