0

私の仕事は、yuv ファイルを読み取り、その各コンポーネント (Y、Cb、Cr) にデータを追加して別のファイルに保存することです。以下のコードを試しました:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    FILE *fp=fopen("traffic_1920x1080.yuv","rb");
    FILE *myYUV=fopen("traffic_1920x1088.yuv","ab");
    int count=0;
    unsigned char *y=(unsigned char*)malloc(sizeof(unsigned char)*1920*1080);
    unsigned char *u=(unsigned char*)malloc(sizeof(unsigned char)*(1920/2)*(1080/2));
    unsigned char *v=(unsigned char*)malloc(sizeof(unsigned char)*(1920/2)*(1080/2));

    unsigned char ypad[1920*8];
    unsigned char upad[(1920/2)*4];
    unsigned char vpad[(1920/2)*4];

    for(int i=0;i<(1920/2)*4;i++)
    {
        ypad[i]=255;
        upad[i]=128;
        vpad[i]=128;
    }
    for(int i=(1920/2)*4;i<1920*8;i++)
        ypad[i]=255;
    while (!feof(fp))
    {
        fread(y,sizeof(unsigned char),1920*1080,fp);
        fread(u,sizeof(unsigned char),1920/2*1080/2,fp);
        fread(v,sizeof(unsigned char),1920/2*1080/2,fp);

        fwrite(y, sizeof(unsigned char),1920*1080,myYUV);
        fwrite(ypad,sizeof(unsigned char),1920*8,myYUV);

        fwrite(u,sizeof(unsigned char),1920/2*1080/2,myYUV);
        fwrite(upad,sizeof(unsigned char),1920/2*4,myYUV);

        fwrite(v,sizeof(unsigned char),1920/2*1080/2,myYUV);
        fwrite(vpad,sizeof(unsigned char),1920/2*4,myYUV);

        printf("Frame %d created\r",count);
        y+=1920*1080;
        u+=1920/2*1080/2;
        v+=1920/2*1080/2;
        count ++;
    }
    free(y);
    free(u);
    free(v);

    fclose(fp);
    fclose(myYUV);
}

ただし、上記のコードは最初のループでは正常に機能しますが、2 番目のループでは例外が発生します。

Access violation writing location 0x0092f000.

行でfwrite(y, sizeof(unsigned char),1920*1080,myYUV);

これはポインタのインクリメントに問題がありますか? それとも何か他のものですか?返信してください。前もって感謝します。

4

1 に答える 1

3

これらの増分:

y+=1920*1080;
u+=1920/2*1080/2;
v+=1920/2*1080/2;

割り当てられたメモリの最後を超えてポインタをインクリメントします。たとえば、y割り当てられたメモリの 1920*1080 バイトの先頭を指します。それをそれだけ大きくすると、そのメモリの終わりを過ぎてポイントします。これにより、未割り当てメモリへの/からの読み取り/書き込みが発生します。そのため、アクセス違反が発生します。

これらのポインターがインクリメントされる理由は実際にはまったくわかりません。

それ以外では、コードでエラー状態 (fopen() が成功したかなど) をチェックする必要があります。

于 2013-07-15T07:28:31.633 に答える